Hive/Spark/Presto SQL 备忘
Keywords: Hive SQL, Spark SQL, Presto SQL
参考资料
复杂案例
数据类型
基本类型 TODO
容器类型
主要有 4 中容器类型:
ARRAY<data_type>MAP<primitive_type, data_type>STRUCT<col_name : data_type [COMMENT col_comment], ...>UNIONTYPE<data_type, data_type, ...>(一般不使用)
基本构造函数
常用 DDL
数据定义语言 (Data Definition Language, DDL)
建表 (CREATE)
CREATE)临时表
注意: Hive 和 Spark 中的临时表语法不同;
物理临时表使用注意事项 : 1) 使用物理临时表时, 一定要添加任务相关的标识, 如
db.tmp_taskname_tablename, 否则可能导致在不用任务间依赖相同的临时表, 当临时表在其中一个任务中被删除时, 另一个任务执行失败; 2) 系统支持自动删除tmp表, 或者在脚本末尾手动删除;
修改 (ALTER)
ALTER)修改列
一条
ALTER语句一次只能修改一列;
增加列
一条
ALTER语句一次只能修改一列, 但是能增加多列;
常用查询/技巧
数据查询语言 (Data Query Language, DQL)
聚合操作 (GROUP BY)
GROUP BY)排序 sort_array(collect_list(...))
sort_array(collect_list(...))hiveql - Sorting within collect_list() in hive - Stack Overflow
sort_array(collect_list(STRUCT(cnt, item_cnt_pair))).col2相当于 python 中的对一个元组列表进行排序, 排序的 key 依次从元组中取;一般情况下, 先排序(
ORDER/SORT BY), 再collect_list也可以, 但是速度比较慢;
侧视图 (LATERAL VIEW)
LATERAL VIEW)侧视图 for Presto (CROSS JOIN)
CROSS JOIN)Presto 中与 Hive 三个示例对应的写法
以下 SQL 未经过测试, 其中构造的 array 的方法在 Presto 中可能有问题;
子查询 (WITH t AS (...))
WITH t AS (...))Common Table Expression (CTE) - Spark Documentation
Hive 官方文档没查到相关的语法, 有些环境确实也不支持这个语法;
数组操作
Hive 提供的内置函数较少, 一般使用外部 UDF; Spark 则提供了丰富的数组操作函数, 一般命名为
array_*;常用的 Hive UDF 库
分页
使用场景: 限制每次下载/浏览的数据量时
构造示例/测试数据
对称去重 (基于 sort_array)
sort_array)对具有对称性的 pair/tuple, 直接使用
GROUP BY无法达到去重的目的, 可以先对 pair/tuple 排序;
hive 中数组下标从 0 开始; 但一些 sql 是从 1 开始的, 如 presto;
TODO: 当有很多列时, 如何自动展开
常用函数/UDF
Hive Operators and User-Defined Functions (UDFs) - Apache Hive
字符串
数学
聚合函数
函数细节
collect_set / collect_list不会收集NULL值
条件函数
CASE WHEN
CASE WHEN表生成函数 (UDTF)
Python Transform 用法
Map-Reduce 语法
MAP ...和REDUCE ...实际上就是SELECT TRANSFORM ( ... )的语法转换, 即以下两种写法是等价的;
更多示例
窗口与分析函数
排序 (ROW_NUMBER/RANK/DENSE_RANK)
ROW_NUMBER/RANK/DENSE_RANK)切片 (NTILE) TODO
NTILE) TODO去重 (基于 ROW_NUMBER)
ROW_NUMBER)去重最常用的方法是使用
GROUP BY, 但有时不适用, 比如线上存在多个模型的结果, 我们需要最近出现次数最多的一个, 这时使用ROW_NUMBER更方便;
排序分位值
配置属性
Hive
其他
DISTINCT 和 GROUP BY 在去重时有区别吗?
DISTINCT 和 GROUP BY 在去重时有区别吗?一些旧的经验会告诉你
GROUP BY效率更高;但是实际上两者的效率应该是一样的 (基于比较新的版本), 因为两者执行的步骤相同;
sql -
distinctvsgroup bywhich is better - Stack Overflow (来自2021年的回答)
web 模板变量
如果公司提供了一个基于 Web 的 Hive 脚本编写平台, 那么一般都会支持这个功能;
下面以 VTL (Velocity 模板语言) 为例;
从 Hive 迁移到 Presto
下面记录区别较大的用法:
Presto 中使用
varchar代替string;Presto 中数组下标从 1 开始, Hive 从 0 开始;
Presto 中测试图关键字为
CROSS JOIN, Hive 中为LATERAL VIEW, 详见 侧视图 for Presto;Presto 中构造数组的语法
array[1,2,3], Hive 中为array(1,2,3)
异常记录
对 f(col) 分组或排序
f(col) 分组或排序日期加减
AS 多个别名时要不要括号?
AS 多个别名时要不要括号?自动类型转换
Hive 支持自动类型转换, 但是自动类型转换不一定会在所有你认为会发生的地方发生;
比如不支持将
map<string, bigint>自动转换为map<string, double>;解决方法: 使用
CAST显式转换;
规避暴力扫描警告
在公共环境, 一般会限制单个查询扫描的数据量;
规避方法: 使用
UNION ALL
Last updated