1、Hive Dialect 支持的 HiveQL(DQL)范围
Hive Dialect 主要覆盖 Hive 常用查询(DQL)的一个子集,核心包括:
- Sort / Cluster / Distribute BY
- Group By
- Join
- Set Operation(UNION/UNION ALL 等)
- Lateral View(含 explode 等 UDTF 场景)
- Window Functions
- Sub-Queries
- CTE(WITH ...)
- Transform
- Table Sample
这意味着:你在 Hive 里常写的"聚合、排序、窗口、CTE、UDTF 展开"等大多数查询写法,在 Flink 的 Hive Dialect 下都能用。
2、整体语法骨架(建议放到文章里当"速查模板")
Hive Dialect 的 SELECT 查询大体长这样(可复制当模板):
sql
[WITH CommonTableExpression [ , ... ]]
SELECT [ALL | DISTINCT] select_expr [ , ... ]
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[ORDER BY col_list]
[CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY col_list]
]
[LIMIT [offset,] rows]
几个非常实用的小结论(写给读者看的"规则"):
- SELECT 可以作为 set query 的一部分,也可以嵌在子查询里
- CTE(WITH)是临时结果集,适合做逻辑分层
table_reference可以是表、视图、join、子查询- 表名、列名大小写不敏感
3、关键子句说明(带"为什么/什么时候用")
3.1 WHERE:过滤条件 + 部分子查询
WHERE 是布尔表达式,支持多种运算符与 UDF,也支持部分类型的子查询。常用于先过滤再聚合,减少数据量。
3.2 GROUP BY:聚合分析核心
GROUP BY 的细节你可以在文章里单开一节(如果要写得更深),这里建议强调:Hive Dialect 的聚合语义基本与 Hive 一致,是最常用的一类查询。
3.3 ORDER BY:全局有序(代价更高)
ORDER BY 与 SORT BY 的关键区别在于:ORDER BY 保证全局排序 。
但全局排序通常意味着最终阶段需要单并发排序(容易成为瓶颈),如果结果行数很大,会非常慢。文章里强烈建议读者:
- 结果很大时避免 ORDER BY 全局排序
- 只做局部有序或按分区有序时,用 SORT BY / DISTRIBUTE BY 配合更合理
3.4 CLUSTER / DISTRIBUTE / SORT BY:更"可扩展"的排序/分发
这一组通常用在"大数据量 + 需要一定顺序/分桶"场景:
- DISTRIBUTE BY:控制数据如何分发到下游任务(按 key 分区)
- SORT BY:每个分区内部排序(非全局)
- CLUSTER BY:通常等价于 DISTRIBUTE BY + SORT BY(按同一列)
你可以在文章里加一句经验:
"要全局有序用 ORDER BY,要可扩展的排序/分桶用 DISTRIBUTE/SORT/CLUSTER。"
3.5 ALL / DISTINCT:去重会带来额外代价
默认 ALL(保留重复行),DISTINCT 会做去重(通常需要聚合/shuffle),对性能有影响。建议读者在大表上谨慎用 DISTINCT。
3.6 LIMIT:支持 offset 与 rows
LIMIT 支持两种形式:
LIMIT rows:取前 rows 行(offset 默认 0)LIMIT offset, rows:从 offset 开始取 rows 行
适合做抽样验证与交互式调试。
4、示例:从"准备 Hive 环境"到"跑 Hive Dialect 查询"
这里你给的示例非常完整,我建议你在文章里按"步骤化"呈现,并加一行强调点:
注意:Hive Dialect 不再支持 Flink SQL(Flink 语法),想写 Flink 原生语法请切回 default dialect。
4.1 创建 HiveCatalog + 加载 HiveModule + 切换 Hive Dialect
sql
CREATE CATALOG myhive WITH (
'type' = 'hive',
'hive-conf-dir' = '/opt/hive-conf'
);
USE CATALOG myhive;
LOAD MODULE hive;
USE MODULES hive, core;
SET table.sql-dialect = hive;
SET sql-client.execution.result-mode = tableau;
4.2 调用 Hive UDTF:Lateral View/Explode(示例 explode array)
sql
SELECT explode(array(1,2,3));
你会看到结果以多行返回(UDTF 展开典型场景)。
4.3 准备数据表并写入测试数据
sql
CREATE TABLE tbl (key INT, value STRING);
INSERT INTO TABLE tbl
VALUES (5,'e'),(1,'a'),(1,'a'),(3,'c'),(2,'b'),(3,'c'),(3,'c'),(4,'d');
4.4 切到 batch 并运行 CLUSTER BY
sql
SET execution.runtime-mode = batch;
SELECT * FROM tbl CLUSTER BY key;
这个例子很适合在文章里用来解释:
"CLUSTER BY 更像是分桶 + 分区内排序的组合,适合做可扩展的'按 key 组织数据'。"
5、建议你在文章里加的"实战提醒"(很加分)
- 写 Hive 语法前先确认:Catalog 是 HiveCatalog、HiveModule 已加载、dialect 已切 hive
- ORDER BY 慎用在大结果集:它要全局有序,容易慢
- 想用 Flink 原生语法(比如一些 Flink 特有函数/语法)就切回
table.sql-dialect=default