Hive SQL 数据操作主要是针对表的增删改查,和标准 SQL 类似,其中最常用的是查询语句,即 SELECT 相关语句。
Hive 查询
Hive 查询语句是 SELECT 语句,语法如下:
[WITH CommonTableExpression (, CommonTableExpression)*] (Note: Only available starting with Hive 0.13.0)
SELECT [ALL | DISTINCT] select_expr, 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]
最简单的查询语句,查询 t1 表的所有字段,代码如下:
SELECT * FROM t1
WHERE 子句
WHERE 子句是 boolean 表达式,例如,查找年龄大于 25 岁,性别为女的记录:
SELECT * FROM t1 WHERE age > 25 AND sex = 'female'
ALL 和 DISTINCT 子句
ALL 和 DISTINCT 选项指定是否要返回重复的行。如果没有给出该选项,则表示使用默认值 ALL(即返回所有匹配的行);DISTINCT 选项为指定从结果集中删除重复的行。
值得注意的是,DISTINCT 选项从 1.1.0 版本开始支持。
hive> SELECT col1, col2 FROM t1
1 3
1 3
1 4
2 5
hive> SELECT DISTINCT col1, col2 FROM t1
1 3
1 4
2 5
hive> SELECT DISTINCT col1 FROM t1
1
2
更多 DISTINCT 相关内容:
基于分区查询
当指定表有分区定义(即 PARTITIONED BY 子句),查询可以在指定的分区范围内进行,否则会扫描整个表;此外,要想让分区内查询,必须在 WHERE 或 JOIN ... ON ... 子句上明确指定分区字段信息。
假设表的分区信息是日期字段 dt,那分区查询示例如下:
SELECT * FROM t1
WHERE dt >= '2020-09-15' AND dt <= '2020-10-08'
如果表 t1 和 t2 通过 JOIN 关联时,若要分区起作用,需要在 ON 上指定分区信息,示例如下:
SELECT t1.*
FROM t1 JOIN t2
ON (t1.user_id = t2.id AND t1.dt >= '2020-09-15' AND t1.dt <= '2020-10-08')
GROUP BY 子句
Hive 提供 GROUP BY 子句做聚合操作。
SELECT col1 FROM t1 GROUP BY col1
Having 子句
聚合语句 GROUP BY 常和 HAVING 子句结合使用,用于指定聚合条件。
Hive 在 0.7.0 版本开始支持 HAVING,之前老版本需要通过其它 SELECT 子句才能做到,示例如下:
SELECT col1 FROM t1 GROUP BY col1 HAVING SUM(col2) > 10
等同于:
SELECT col1 FROM (SELECT col1, SUM(col2) AS col2sum FROM t1 GROUP BY col1) t2 WHERE t2.col2sum > 10
LIMIT 子句
LIMIT 子句可用于约束 SELECT 语句返回的行数。
LIMIT 子句可以指定一个或两个数字参数,这两个参数必须都是非负整数常量。
第一个参数指定要返回的第一行的偏移量(从 Hive 2.0.0 开始支持),第二个参数指定要返回的最大行数。
当给出单个参数时,它代表最大行数,此时偏移量默认为 0。
返回前 5 条记录,示例如下:
SELECT * FROM t1 LIMIT 5
返回第 3 个到第 7 个的记录,代码如下:
SELECT * FROM t1 LIMIT 2, 5
UNION 子句
hive 的查询中 UNION 子句将两个结构相同的表合并起来进行操作,UNION 可以单独使用,也可以 UNION ALL 搭配使用,两者区别如下:
- UNION ALL 将两个表进行不去重合并,同时也没任何排序,由于只是简单地将两个列相同的表合并,所以效率比较快。
- 通过 UNION 合并的表,会对结果集进行去重,同时进行默认规则的排序,作用等价于先 DISTINCT 去重、再 UNION ALL 表合并、再 ORDER BY 排序,效率方面它是 UNION ALL 的3倍,所以,数据量大时,不建议直接用 UNION。
select_statement UNION [ALL | DISTINCT] select_statement UNION [ALL | DISTINCT] select_statement ...
更多相关信息参考 Hive UNION 和 UNION ALL 用法详解。
LETERAL VIEW
LETERAL VIEW 要与 UDTF 函数一起使用,比如 EXPLODE() 函数。LETERAL VIEW 首先将 UDTF 函数应用到每一行上,这时每一行经 UDTF 处理后得到多行输出,这些输出将会组建成一张虚拟表,然后这张虚拟表会跟当前表进行 JOIN 操作,JOIN 完成之后会得出一张结果虚拟表,这张结果表里就有了 UDTF 生成的列,当然原表的列除了 UDTF 消耗的列之外肯定也在都里面。
语法如下:
LATERAL VIEW udtf_function( expression [, ...] ) [ table_identifier ] AS column_identifier [, ...]
更多信息,请参见 LETERAL VIEW 的详细用法。