Hive/Spark/Presto SQL 备忘

last modify

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, ...> (一般不使用)

基本构造函数

Complex Type Constructors - Apache Hive

常用 DDL

数据定义语言 (Data Definition Language, DDL)

建表 (CREATE)

CreateTable - Apache Hive

临时表

  • 注意: Hive 和 Spark 中的临时表语法不同;

物理临时表使用注意事项 : 1) 使用物理临时表时, 一定要添加任务相关的标识, 如 db.tmp_taskname_tablename, 否则可能导致在不用任务间依赖相同的临时表, 当临时表在其中一个任务中被删除时, 另一个任务执行失败; 2) 系统支持自动删除 tmp 表, 或者在脚本末尾手动删除;

修改 (ALTER)

Alter Table/Partition/Column - Apache Hive

修改列

Change Column Name/Type/Position/Comment - Apache Hive

  • 一条 ALTER 语句一次只能修改一列;

增加列

Add/Replace Columns - Apache Hive

  • 一条 ALTER 语句一次只能修改一列, 但是能增加多列;

常用查询/技巧

数据查询语言 (Data Query Language, DQL)

聚合操作 (GROUP BY)

排序 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)

侧视图 for Presto (CROSS JOIN)

Presto 中与 Hive 三个示例对应的写法

以下 SQL 未经过测试, 其中构造的 array 的方法在 Presto 中可能有问题;

子查询 (WITH t AS (...))

Common Table Expression (CTE) - Spark Documentation

Hive 官方文档没查到相关的语法, 有些环境确实也不支持这个语法;

数组操作

  • Hive 提供的内置函数较少, 一般使用外部 UDF; Spark 则提供了丰富的数组操作函数, 一般命名为 array_*;

  • 常用的 Hive UDF 库

分页

使用场景: 限制每次下载/浏览的数据量时

传统数据库 SQL 窗口函数实现高效分页查询的案例分析_MsSql_脚本之家

构造示例/测试数据

表生成函数 (UDTF)

对称去重 (基于 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

条件函数

Conditional Functions - Apache Hive

CASE WHEN

表生成函数 (UDTF)

Built-in Table-Generating Functions (UDTF) - Apache Hive

Python Transform 用法

Transform/Map-Reduce Syntax - Apache Hive

Map-Reduce 语法

  • MAP ...REDUCE ... 实际上就是 SELECT TRANSFORM ( ... ) 的语法转换, 即以下两种写法是等价的;

更多示例

窗口与分析函数

Windowing and Analytics Functions - Apache Hive

排序 (ROW_NUMBER/RANK/DENSE_RANK)

切片 (NTILE) TODO

去重 (基于 ROW_NUMBER)

  • 去重最常用的方法是使用 GROUP BY, 但有时不适用, 比如线上存在多个模型的结果, 我们需要最近出现次数最多的一个, 这时使用 ROW_NUMBER 更方便;

排序分位值

配置属性

Hive

Configuration Properties - Apache Hive

其他

DISTINCTGROUP BY 在去重时有区别吗?

web 模板变量

  • 如果公司提供了一个基于 Web 的 Hive 脚本编写平台, 那么一般都会支持这个功能;

  • 下面以 VTL (Velocity 模板语言) 为例;

从 Hive 迁移到 Presto

Migrating From Hive — Presto Documentation

下面记录区别较大的用法:

  • 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) 分组或排序

GROUPing and SORTing on f(column) - Apache Hive

日期加减

AS 多个别名时要不要括号?

自动类型转换

  • Hive 支持自动类型转换, 但是自动类型转换不一定会在所有你认为会发生的地方发生;

  • 比如不支持将 map<string, bigint> 自动转换为 map<string, double>;

  • 解决方法: 使用 CAST 显式转换;

规避暴力扫描警告

  • 在公共环境, 一般会限制单个查询扫描的数据量;

  • 规避方法: 使用 UNION ALL

Last updated