On this page
LanguageManual Select
GROUP BY; SORT/ORDER/CLUSTER/DISTRIBUTE BY; JOIN (Hive Joins, Join Optimization, 外部连接行为); UNION; TABLESAMPLE; Subqueries; Virtual Columns; 运算符和 UDF; LATERAL VIEW; 窗口化,覆盖和分析; 常用表表达式
Select Syntax
[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]
table_reference
表示查询的 Importing。它可以是常规表a view,join construct或subquery。表名和列名不区分大小写。
在 Hive 0.12 和更早版本中,表和列名称中仅允许使用字母数字和下划线字符。
在 Hive 0.13 和更高版本中,列名称可以包含任何Unicode字符(请参阅HIVE-6013)。反引号(``'')中指定的任何列名均按字面意义对待。在反引号字符串中,使用双反引号(````)表示反引号字符。
要恢复到 0.13.0 之前的行为并将列名限制为字母数字和下划线字符,请将配置属性
hive.support.quoted.identifiers
设置为none
。在此配置中,带反引号的名称被解释为正则表达式。有关详细信息,请参阅列名称中支持带引号的标识符(附加到HIVE-6013)。另请参见下面的REGEX 色谱柱规格。
简单查询。例如,以下查询从表 t1 中检索所有列和所有行。
SELECT * FROM t1
Note
从Hive 0.13.0开始,FROM 是可选的(例如SELECT 1+1
)。
- 要获取当前数据库(截至Hive 0.13.0),请使用current_database() function:
SELECT current_database()
- 要指定数据库,请使用数据库名称来限定表名(以_开头的“
db_name.table_name
”),或者在查询语句之前以Hive 0.6开头的方式发出USE statement。
“ db_name.table_name
”允许查询访问不同数据库中的表。
USE 为所有后续的 HiveQL 语句设置数据库。用关键字“ default
”重新发出,以重置为默认数据库。
USE database_name;
SELECT query_specifications;
USE default;
WHERE Clause
WHERE 条件是boolean表达式。例如,以下查询仅返回美国区域中金额大于 10 的那些销售记录。 Hive 在 WHERE 子句中支持多个操作符和 UDF:
SELECT * FROM sales WHERE amount > 10 AND region = "US"
从 Hive 0.13 开始,WHERE 子句中支持某些类型的subqueries。
ALL 和 DISTINCT 子句
ALL 和 DISTINCT 选项指定是否应返回重复的行。如果没有给出这些选项,则默认值为 ALL(返回所有匹配的行)。 DISTINCT 指定从结果集中删除重复的行。注意,Hive 从版本 1.1.0(HIVE-9194)开始支持 SELECT DISTINCT *。
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
ALL 和 DISTINCT 也可以在 UNION 子句中使用-有关更多信息,请参见Union Syntax。
基于分区的查询
通常,SELECT 查询将扫描整个表(而不是sampling)。如果使用PARTITIONED BY子句创建的表,则查询可以进行“分区修剪”,并且仅扫描与查询指定的分区相关的表的一部分。如果在 WHERE 子句或 JOIN 的 ON 子句中指定了分区谓词,则 Hive 当前会进行分区修剪。例如,如果表 page_views 是按列日期进行分区的,则以下查询将检索 2008-03-01 至 2008-03-31 之间仅几天的行。
SELECT page_views.*
FROM page_views
WHERE page_views.date >= '2008-03-01' AND page_views.date <= '2008-03-31'
如果表 page_views 与另一个表 dim_users 联接在一起,则可以在 ON 子句中指定分区范围,如下所示:
SELECT page_views.*
FROM page_views JOIN dim_users
ON (page_views.user_id = dim_users.id AND page_views.date >= '2008-03-01' AND page_views.date <= '2008-03-31')
另请参见分区过滤器语法。
另请参见Group By。
另请参见排序方式/集群方式/分配方式/排序方式。
HAVING Clause
Hive 在版本 0.7.0 中添加了对 HAVING 子句的支持。在旧版本的 Hive 中,可以通过使用子查询来达到相同的效果,例如:
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 Clause
LIMIT 子句可用于约束 SELECT 语句返回的行数。
LIMIT 接受一个或两个数字参数,这两个参数都必须是非负整数常量。
第一个参数指定要返回的第一行的偏移量(从Hive 2.0.0开始),第二个参数指定要返回的最大行数。
当给出单个参数时,它代表最大行数,偏移量默认为 0.
以下查询返回 5 个任意 Client
SELECT * FROM customers LIMIT 5
以下查询返回要创建的前 5 个 Client
SELECT * FROM customers ORDER BY create_date LIMIT 5
以下查询将要创建的第 3 个 Client 返回第 7 个 Client
SELECT * FROM customers ORDER BY create_date LIMIT 2,5
REGEX 列规格
如果配置属性hive.support.quoted.identifiers
设置为none
,则 SELECT 语句在 0.13.0 之前的 Hive 版本或 0.13.0 及更高版本中可以采用基于正则表达式的列规范。
我们使用 Java regex 语法。尝试http://www.fileformat.info/tool/regex.htm进行测试。
以下查询选择 ds 和 hr 以外的所有列。
SELECT `(ds|hr)?+.+` FROM sales
更多选择语法
有关 SELECT 语句的其他语法和功能,请参见以下文档: