hql为hive sql的缩写。hive本身为java语言开发而成,所以hive上面如果有什么特殊需求,完全可以是用hive udf订制自己的需求(后续会介绍udf的开发方法)。
以下只列举一些对作者有用的语法.
LIKE操作
语法: A LIKE B
操作类型:string
描述:如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合表达式B 的正则语法,则为TRUE;否则为FALSE。B中字符”_”表示任意单个字符,而字符”%”表示任意数量的字符。
举例:
hive> select * from tbl_lzo where sport like 'foot%';
...footbar...
hive> select * from tbl_lzo where sport like 'foot___';
...footbar...
hive> select * from tbl_lzo where not sport like 'foot___'; ## 否定
REGEXP操作
语法:A REGEXP B
操作类型:string
描述:如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合JAVA正则表达式B的正则语法,则为TRUE;否则为FALSE。
举例:
hive> select * from tbl_lzo where sport REGEXP '^f.*r$';
ROUND操作
语法:round(double a, int decim)
返回值:double
说明:返回指定精度decim的double类型
举例:
hive> select round(score, 2) from tbl_lzo;
FROM_UNIXTIME函数
语法:from_unixtime(bigint unixtime[, string format])
返回值:string
说明:转化UNIX时间戳(从1970-01-01 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式
举例:
hive> select from_unixtime(timestamp,'yyyyMMdd') from tbl_lzo;
UNIX_TIMESTAMP函数
语法:unix_timestamp([string date[, string pattern]])
返回值: bigint
说明:如果有date,则按照pattern格式的日期转换到UNIX时间戳。转换失败则为0
举例:
hive> select unix_timestamp(), unix_timestamp('2016-01-05 17:50:33'), unix_timestamp('2016-01-05 17:50:33', 'yyyyMMdd') from tbl_lzo;
TO_DATE函数
语法:to_date(string datetime)
返回值:string
说明:返回日期时间字段中的日期部分
举例:
hive> select to_date('2016-01-05 17:54:22') from tbl_lzo;
datediff函数 [date_add,date_sub]
语法:datediff(string enddate, string startdate)
返回值:int
说明:返回结束日期减去开始日期的天数
举例:
hive> select datediff('2016-01-05', '2015-11-13') from tbl_lzo;
CASE函数
语法:
1.CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END
2.CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END
返回值:T
说明:
1.如果a等于b,那么返回c;如果a等于d,那么返回e;否则返回f
2.如果a为TRUE,则返回b;如果c为TRUE,则返回d;否则返回e
字符串长度函数:length
语法: length(string A)
返回值: int
说明:返回字符串A的长度
举例:
hive> select length('abcedfg') from tbl_lzo;
字符串反转函数:reverse
语法: reverse(string A)
返回值: string
说明:返回字符串A的反转结果
举例:
hive> select reverse('abcedfg’) from tbl_lzo;
字符串连接函数:concat
语法: concat(string A, string B…)
返回值: string
说明:返回输入字符串连接后的结果,支持任意个输入字符串
举例:
hive> select concat(‘abc’,'def’,'gh’) from tbl_lzo;
带分隔符字符串连接函数:concat_ws
语法: concat_ws(string SEP, string A, string B…)
返回值: string
说明:返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符
举例:
hive> select concat_ws(',','abc','def','gh') from tbl_lzo;
字符串截取函数:substr,substring
语法:
substr(string A, int start, int len)
substring(string A, intstart, int len)
返回值: string
说明:返回字符串A从start位置开始,长度为len的字符串
举例:
hive> select substr('abcde',3,2) from tbl_lzo;
Map类型构建: map
语法: map (key1, value1, key2, value2, …)
说明:根据输入的key和value对构建map类型
举例:
hive> Create table lxw_test as select
map('100','tom','200','mary')as t from tbl_lzo;
hive> describe tbl_lzo;
t map<string,string>
hive> select t from tbl_lzo;
{"100":"tom","200":"mary"}
Struct类型构建: struct
语法: struct(val1, val2, val3, …)
说明:根据输入的参数构建结构体struct类型
举例:
hive> create table tbl_lzo as select
struct('tom','mary','tim')as t from tbl_lzo;
hive> describe tbl_lzo;
t structstring,col2:string,col3:string>
hive> select t from tbl_lzo;
{"col1":"tom","col2":"mary","col3":"tim"}
array类型构建: array
语法: array(val1, val2, …)
说明:根据输入的参数构建数组array类型
举例:
hive> create table tbl_lzo as
select array("tom","mary","tim") as t from tbl_lzo;
hive> describe tbl_lzo;
t array<string>
hive> select t from tbl_lzo;
["tom","mary","tim"]
struct类型访问: S.x
语法: S.x
操作类型: S为struct类型
说明:返回结构体S中的x字段。比如,对于结构体struct foobar
{int foo, int bar},foobar.foo返回结构体中的foo字段
举例:
hive> create table tbl_lzo as select
struct('tom','mary','tim')as t from tbl_lzo;
hive> describe tbl_lzo;
t structstring,col2:string,col3:string>
hive> select t.col1,t.col3 from tbl_lzo;
tom tim
array类型长度函数: size(Array)
语法: size(Array)
返回值: int
说明: 返回array类型的长度
举例:
hive> select size(array('100','101','102','103'))
from tbl_lzo;
详细命令可参考:
http://blog.csdn.net/wisgood/article/details/17376393
http://www.cnblogs.com/end/archive/2012/06/18/2553682.html
下面介绍内容为本篇博客重点
数据去重collect_set函数
语法:collect_set(string column)
返回值:array
说明:返回去重的array数组数据
举例:
hive> select imei, device_os, collect_set(province), collect_set(game) from s_tbl_lzo where dayid='20160104' group by imei, device_os;
collect_set函数属于聚合操作,可以根据主键来聚合其他列中为字符串的列。