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]
  • SELECT 语句可以是union查询或另一查询的subquery的一部分。

  • table_reference表示查询的 Importing。它可以是常规表a viewjoin constructsubquery

  • 表名和列名不区分大小写。

  • 在 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)。

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')

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 及更高版本中可以采用基于正则表达式的列规范。

SELECT `(ds|hr)?+.+` FROM sales

更多选择语法

有关 SELECT 语句的其他语法和功能,请参见以下文档: