Hive —— HQL

Hive的操作语言HQL和SQL大同小异

数据库操作

-- 创建
CREATE DATABASE mydb;
-- 使用
USE mydb;
-- 删除
DROP DATABASE mydb;
-- 强制删除
DROP DATABASE mydb CASCADE;

创建表

-- 与SQL语句唯一的不同就是多了一个分割符
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name (
	col_name data_type [COMMENT col_comment],
	...)
[COMMENT table_comment]
[ROW FORMAT DELIMITED 
 	FIELDS TERMINATED BY ","
 	...];
 	
-- 查看元数据信息
desc formatted mytable;

-- 删除表
DROP table mytable;

Hive数据类型 对应Java数据类型
TINYINT byte
SMALINT short
INT int
BIGINT long
BOOLEAN boolean
FLOAT float
DOUBLE double
STRING string
TIMESTAMP (时间类型)
BINARY (字节数组)
MAP Map
ARRAY Array
STRUCT 类似c中的struct,用 . 访问

注释中文乱码

在远端的mysql中执行

-- 在mysql中执行
use hive;
-- 修改表字段注解和表注解
alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
-- 修改分区字段注解
alter table PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
-- 修改索引注解
alter table INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;

添加数据

-- 加载数据
LOAD DATA [LOCAL] INPATH '文件路径' [OVERWRITE] INTO TABLE mytable;

-- 插入数据使用insert int用当作一个mapreduce去执行非常缓慢
-- 可以使用insert+select将一张表的数据部分插入到新表中,类似视图的创建
INSERT [OVERWRITE] TABLE mytable partition(dt='xxxxxx')select c1,c2 from src_table where......

查询数据

-- 单表查询
SELECT [ALL|DISTINCT] select_expr,select_expr,...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[HAVING having_condition]
[ORDER BY col_list]
[LIMIT [offset,]rows];

-- 连接查询
table_reference [INNER] JOIN table_factor [join_condition] -- 内连接
table_interface {left} [OUTER] JOIN table_reference join_condition	-- 左【外】连接 

常用函数

-- 查看所有可用函数
show functions;
-- 查看函数的使用方式
describe function extended func_name;

-- 字符串函数
select length("str");	-- 查询字符串长度
select reverse("str"); 	--反转字符串
select concat("str1","str2")	-- 字符串拼接
select concat_ws(separator,[string | array(string)]+) -- 以separator拼接
select substr("str",-2) 	-- 字符串截取,从1开始,负数从尾部开始
select substr("str",2,2) 	-- 从2开始,截取两个
select split("str1 str2",' ') -- 分割字符串

-- 日期函数
select current_data()	-- 获取当前日期
select unix_timestamp() -- 当前获取unix时间戳
select unix_timestamp("2222-02-02 02:02:02","yyyy-MM-dd HH:mm:ss") -- 日期转unix时间戳
select from_unixtime(0,"yyyy-MM-dd HH:mm:ss") -- 日期转时间戳
select datadiff("data1","data2") -- 日期比较函数,格式yyyy-MM-dd或yyyy-MM-dd HH:mm:ss
select data_add("data",2)	-- 日期增加函数
select data_sub("data",2)	-- 日期减少函数

-- 数学函数
select round(1.2345,3) 	-- 精度
select rand(int seed)	-- 取随机数

-- limit限制函数
select * from mytable limit 3;

-- if条件函数
select if(condition, TrueValue, FalseValue) from mytable;

-- 条件转换函数
select case col
when cond1 then xxx1
when cond2 then xxx2
else xxx3 end
from mytable;

-- 空值转换函数
select nvl(v1,v2) -- 若v1为空,用v2替换