Hive学习之SELECT语句(一)
2014-07-03 14:19
218 查看
前面学习了Hive中的数据定义语言,也学习了如何加载或者插入数据,在一些示例中或多或少的使用了SELECT语句,但还没有全面系统地学习,现在就开始学习Hive的SELECT语句。Hive的SELECT语句与传统的SQL中的SELECT还是有些区别的。具体的语法如下:
SELECT语句可以作为union查询的一个部分或者另一个查询的子查询,table_reference既可以是表、视图,也可以是联合查询或者子查询。ALL和DISTINCT指定是否返回重复行,在不指定任何关键字的情况下,默认值为ALL,DISTINCT指定删除结果集中的重复记录。HAVING必须出现在GROUP BY之后。下面具体看看SELECT语句的各个部分。
CTE在SELECT语句的示例如下:
CTE在视图,CTAS,插入语句中的使用如下:
如果表page_view与表dim_users进行连接(join),可以在ON从句中指定分区范围,如下:
hive.map.aggr参数控制着如何进行聚类操作,默认值为true,这时Hive会在Map任务中直接执行第一层级的聚类操作,这会提供更高的效率,但却要求更多的内存。
[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任务中直接执行第一层级的聚类操作,这会提供更高的效率,但却要求更多的内存。
相关文章推荐
- Hive学习之SELECT语句(二)
- 关于MSSQL 2000中Select语句FOR XML产生XML文件学习心得
- 刚学习Db2 对一条 select 语句得疑问.
- 学习 SQL 语句 - Select(1): 指定表
- 学习 SQL 语句 - Select(6): 字段运算
- 学习 SQL 语句 - Select(5): 字段别名
- 数据库SELECT语句学习
- 学习 SQL 语句 - Select(9): 其他
- SQL学习笔记三 select语句的各种形式小结
- SQL学习笔记三select语句的各种形式
- 关于MSSQL 2000中Select语句FOR XML产生XML文件学习心得
- oracle学习中遇到的问题——用select语句创建现有表的副本
- 学习 SQL 语句 - Select(4): 排序
- 学习 SQL 语句 - Select(3): 条件查询与模糊查询
- 【Oracle】SQL学习笔记1---基本概念及SELECT语句及提取和排序数据
- 刚学习Db2 对一条 select 语句得疑问.
- 学习 SQL 语句 - Select(2): 指定表中的字段
- 学习 SQL 语句 - Select(6): 字段运算
- 学习 SQL 语句 - Select(3): 条件查询与模糊查询
- 学习 SQL 语句 - Select(8): 分组条件