Hive Dialect 的查询能力支持哪些 HiveQL 子集,怎么写、怎么跑

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
相关推荐
tsyjjOvO13 小时前
SpringMVC 从入门到精通
数据仓库·hive·hadoop
Francek Chen18 小时前
【大数据存储与管理】分布式数据库HBase:05 HBase运行机制
大数据·数据库·hadoop·分布式·hdfs·hbase
zzzzzwbetter19 小时前
Hadoop完全分布式部署-Master的NameNode以及Slaver2的DataNode未启动
大数据·hadoop·分布式
weixin_4493108421 小时前
ETL转换和数据写入小满OKKICRM的技术细节
数据仓库·php·etl
IvanCodes1 天前
Hive IDE连接及UDF实战
ide·hive·hadoop
yumgpkpm1 天前
华为昇腾910B 开源软件GPUStack的介绍(Cloudera CDH、CDP)
人工智能·hadoop·elasticsearch·flink·kafka·企业微信·big data
lifewange2 天前
Hive数据库
数据库·hive·hadoop
五月天的尾巴3 天前
hive数据库模糊查询表名
hive·查询表名
蓝魔Y3 天前
hive—1.1、执行优化
hive
快乐非自愿3 天前
OpenClaw 生态适配:Hadoop/Hive 技能现状与企业级集成方案
大数据·hive·hadoop·分布式·openclaw