您的位置:首页 > 其它

Hive学习之SELECT语句(一)

2014-07-03 14:19 218 查看
       前面学习了Hive中的数据定义语言,也学习了如何加载或者插入数据,在一些示例中或多或少的使用了SELECT语句,但还没有全面系统地学习,现在就开始学习Hive的SELECT语句。Hive的SELECT语句与传统的SQL中的SELECT还是有些区别的。具体的语法如下:

[WITH CommonTableExpression(, CommonTableExpression)*]
SELECT [ALL | DISTINCT]select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BYcol_list]
[HAVING where_condition]
[ORDER BYcol_list]
[CLUSTER BYcol_list
| [DISTRIBUTE BY col_list] [SORT BY col_list]
]
[LIMIT number]


      SELECT语句可以作为union查询的一个部分或者另一个查询的子查询,table_reference既可以是表、视图,也可以是联合查询或者子查询。ALL和DISTINCT指定是否返回重复行,在不指定任何关键字的情况下,默认值为ALL,DISTINCT指定删除结果集中的重复记录。HAVING必须出现在GROUP BY之后。下面具体看看SELECT语句的各个部分。

Common Table Expression(CTE)

      Common Table Expression (CTE)是由WITH子句指定的简单查询得到的临时结果集,CTE仅在一条语句的执行范围内定义。在Hive的SELECT, INSERT, CREATE TABLE AS SELECT, 或者CREATE VIEW AS SELECT语句中可以使用一个或者多个CTE,但在子查询中不支持WITH子句。CTE的语法如下:

withClause:cteClause (, cteClause)*
cteClause:cte_name AS (select statment)


      CTE在SELECT语句的示例如下:

with q as(select time_taken from idp where time_taken=15) select * from q;

-- chaining CTEs
with q1 as (select key from q2 where key = '5'),
q2 as ( selectkey from src where key = '5')
select * from(select key from q1) a;

-- union example
with q1 as(select * from src where key= '5'),
q2 as (select *from src s2 where key = '4')
select * from q1union all select * from q2;


 

      CTE在视图,CTAS,插入语句中的使用如下:

-- insert example
with q1 as (select key, value from src where key = '5')
from q1
insert overwritetable s1
select *
;

-- ctas example
create table s2as
with q1 as (select key from src where key = '4')
select * from q1;

-- view example
create view v1as
with q1 as (select key from src where key = '5')
select * from q1;


WHERE从句

      Where从句是布尔表达式,只有满足此表达式的记录才会返回。从Hive-0.13版本开始,一些子查询可以出现在Where从句中,这些子查询的结果被作为IN和NOT IN语句中的常量,EXISTS和NOT EXISTS也是被支持的子查询,示例如下:

SELECT *
FROM  A
WHERE A.a  IN (SELECT  foo  FROM B);

SELECT  A
FROM  T1
WHERE  EXISTS (SELECT  B  FROM  T2  WHERET1.X = T2.Y)


基于分区的查询

      一般情况下,SELECT查询扫描整个表,但是如果使用PARTITIONED BY从句创建表,那么查询可以进行分区修剪并且只扫描查询中与指定分区相关的部分。如果在WHERE从句或者JOIN的ON从句中指定分区,Hive就会执行分区修剪。例如,表page_view在列date上分区,下面的查询仅取回在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_view与表dim_users进行连接(join),可以在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')


LIMIT从句

      Limit从句限制了返回记录的数量,返回的记录是被随机选取的,如果想返回头几条记录,可以先对结果排序然后再使用LIMIT从句,如下:

SELECT * FROM sales SORT BY amount DESC LIMIT 5


GROUP BY从句

      当使用GROUP BY从句时,select语句只能包含那些包含在GROUP BY从句中的列,或者在select语句中使用聚类函数,如count,sum等。聚类函数或者简单查询的输出可以被存入多个表或者HDFS中,如下:

FROM pv_users
INSERT OVERWRITE TABLE pv_gender_sum
SELECT pv_users.gender, count(DISTINCTpv_users.userid)
GROUP BY pv_users.gender
INSERT OVERWRITE DIRECTORY '/user/hadoop/tmp/pv_age_sum'
SELECT pv_users.age, count(DISTINCTpv_users.userid)
GROUP BY pv_users.age;


      hive.map.aggr参数控制着如何进行聚类操作,默认值为true,这时Hive会在Map任务中直接执行第一层级的聚类操作,这会提供更高的效率,但却要求更多的内存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息