- 运算符
- 算数
- +,-,*,/,%,&,|,^,~
- 比较
- =,<=>,<>|!=,<,<=,>,>=,a [not] between b and c,is null,in(),[not] like,a rlike|regexp b(b为正则表达式)
- 逻辑
- and,or,not
- 算数
- 函数
- 自带函数
- https://blog.csdn.net/weixin_43976998/article/details/90318973
- 自定义函数
- jar包
- UDF
- 一对一,普通函数,通常查询的时候,需要对字段格式化处理,类似map
- UDAF
- 多对一,聚合函数,统计,类似groupbykey
- UDTF
- 一对多,表生成函数,类似flatmap
- 官方文档地址
- https://cwiki.apache.org/confluence/display/Hive/HivePlugins
- 开发(scala实现更简单)
- extend UDF|UDAF|UDTF
- 实现evaluate函数(支持重载)
- 注意:UDF必须有返回值,可以返回null,但是返回类型不能为void
- 导入自定义函数
- 加载资源
- add jar /path/jarFile;
- 使用
- 创建
- create (temporary) function (db_name.)fun_name as ‘类全路径’;
- 删除
- drop (temporary) function (if exists) (dbname.)function_name;
- 创建
- 加载资源
- UDF
- transform
- 开发
- awk/python
- 加载资源
- add file /path/transform.awk
- 使用
- select transform() using “awk -f transform.awk” as (newclumn) from table_name limit 10;
- select transform() using “python transform.py” as (newclumn) from table_name limit 10;
- 开发
- jar包
- 自带函数
- 行转列
//3. collect_set对每个分组内的数据去重,生成array,concat_ws对array拼接 例:select t1.base,concat_ws('|', collect_set(t1.name)) name from (select name, concat(constellation, ",", blood_type) base // 1. 拼接 from person_info) t1 group by t1.base; // 2. 根据拼接结果分组 效果: 孙悟空 白羊座 A 射手座,A 大海|凤姐 大海 射手座 A 白羊座,A 孙悟空|猪八戒 宋宋 白羊座 B ==> 白羊座,B 宋宋 猪八戒 白羊座 A 凤姐 射手座 A
- 列转行
- explode(col):一列中复杂的array或者map结构拆分成多行
- lateral view split|explode(column_name) tableAlias as columnAlias:对拆分后的数据进行聚合
例:select movie,category_name from movie_info // 将category切分为多行,并对多行数据聚合 lateral view explode(category) table_tmp as category_name; 效果: 《疑犯追踪》 悬疑,动作,科幻,剧情 《疑犯追踪》 悬疑 《Lie to me》 悬疑,警匪,动作,心理,剧情 ==> 《疑犯追踪》 动作 《战狼2》 战争,动作,灾难 《疑犯追踪》 科幻 《疑犯追踪》 剧情 《Lie to me》 悬疑 《Lie to me》 警匪 《Lie to me》 动作 《Lie to me》 心理 《Lie to me》 剧情 《战狼2》 战争 《战狼2》 动作 《战狼2》 灾难 ```
- 聚合函数+group by+having+函数/聚合函数的别名
- where配合select使用函数对表中数据筛选,having配合group by使用函数/select中函数结果的别名对select出来的数据二次筛选
- 例:select job ,sum(sal) sum from emp where job<>‘SALESMAN’ group by job having sum >5000 order by sum asc;
- join
- 自连接
-例: select b.* from table_name as a,table_name as b where a.column=’’ and a.column1<b.column1 order by b.column2 - 内连接:join
- 只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来
- 左|右外连接:left|right join
- JOIN操作符左|右边表中符合WHERE子句的所有记录将会被返回
- 满外连接:full join
- 将会返回所有表中符合WHERE语句条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用NULL值替代
- 自连接
- 抽样
- select * from table tablesample(bucket x out of y);
- x表示从哪个bucket开始抽取,下一个分区号为x+y,以此类推
- y必须是table总bucket数的倍数或者因子
- 抽样数=总bucket数/y
- 注意:x的值必须小于等于y的值,否则最后一个桶数超出总bucket数范围,报SemanticException
- select * from table tablesample(bucket x out of y);
- 参考
- https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select#space-menu-link-content
hql
最新推荐文章于 2023-06-13 22:45:00 发布