关键字:Hive SELECT、ORDER BY、SORT BY、DISTRIBUTE BY、CLUSTER BY、Hive子查询、Hive虚拟列
八、Hive的查询语句SELECT
在所有的数据库系统中,SELECT语句是使用最多,也最复杂的一块,Hive中的查询语句SELECT支持的语法当然也比较复杂,本文只能尽力去介绍。
8.1 基础查询语法
Hive中的SELECT基础语法和标准SQL语法基本一致,支持WHERE、DISTINCT、GROUP BY、ORDER BY、HAVING、LIMIT、子查询等;
语法如下:
[WITH CommonTableExpression (, CommonTableExpression)*] SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference [WHERE where_condition] [GROUP BY col_list] [CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list] ] [LIMIT number]
下面介绍Hive中比较特殊的一些查询语法。
8.2 ORDER BY和SORT BY
ORDER BY用于全局排序,就是对指定的所有排序键进行全局排序,使用ORDER BY的查询语句,最后会用一个Reduce Task来完成全局排序。
SORT BY用于分区内排序,即每个Reduce任务内排序。
看下面的例子:
原表数据为:
hive> select * from lxw1234_com; OK 5 3 6 2 9 8 1
使用ORDER BY
hive> select * from lxw1234_com order by id; 1 2 3 5 6 8 9
使用SORT BY
hive> set mapred.reduce.tasks=2;
hive> select * from lxw1234_com sort by id;
2
5
6
9
1
3
8
设定了2个reduce,从结果可以看出,每个reduce内做了排序。
如果reduce数为1,那么ORDER BY和SORT BY的结果是一样的:
hive> set mapred.reduce.tasks=1; hive> select * from lxw1234_com sort by id; 1 2 3 5 6 8 9
真实业务环境中,我们的需求大多需要使用ORDER BY全局排序来完成。
8.3 DISTRIBUTE BY和CLUSTER BY
distribute by:按照指定的字段或表达式对数据进行划分,输出到对应的Reduce或者文件中。
cluster by:除了兼具distribute by的功能,还兼具sort by的排序功能。
##distribute by
hive> set mapred.reduce.tasks=2; hive>INSERT overwrite LOCAL directory '/tmp/lxw1234/' SELECT id FROM lxw1234_com distribute BY id;
执行后在本地的/tmp/lxw1234目录中生成了000000_0和000001_0两个文件:
cat 000000_0
8
2
6
cat 000001_0 ##id%2=1的记录
1
9
3
5
##cluster by
hive> set mapred.reduce.tasks=2; hive> INSERT overwrite LOCAL directory '/tmp/lxw1234/' SELECT id FROM lxw1234_com CLUSTER BY id; cat 000000_0 2 6 8 cat 000001_0 1 3 5 9
注意:使用cluster by之后,每个文件中的id都进行了排序,而distribute by没有。
8.4 子查询
子查询和标准SQL中的子查询语法和用法基本一致,需要注意的是,Hive中如果是从一个子查询进行SELECT查询,那么子查询必须设置一个别名。
SELECT col FROM ( SELECT a+b AS col FROM t1 ) t2
另外,从Hive0.13开始,在WHERE子句中也支持子查询,比如:
SELECT * FROM A WHERE A.a IN (SELECT foo FROM B); SELECT A FROM T1 WHERE EXISTS (SELECT B FROM T2 WHERE T1.X = T2.Y)
还有一种将子查询作为一个表的语法,叫做Common Table Expression(CTE):
with q1 as (select * from src where key= '5'), q2 as (select * from src s2 where key = '4') select * from q1 union all select * from q2; with q1 as ( select key, value from src where key = '5') from q1 insert overwrite table s1 select *;
8.5 虚拟列
Hive查询中有两个虚拟列:
INPUT__FILE__NAME:数据对应的HDFS文件名;
BLOCK__OFFSET__INSIDE__FILE:该行记录在文件中的偏移量;
hive> select id,INPUT__FILE__NAME, BLOCK__OFFSET__INSIDE__FILE from lxw1234_com; 5 hdfs://cdh5/tmp/lxw1234/1.txt 0 3 hdfs://cdh5/tmp/lxw1234/1.txt 2 6 hdfs://cdh5/tmp/lxw1234/1.txt 4 2 hdfs://cdh5/tmp/lxw1234/1.txt 6 9 hdfs://cdh5/tmp/lxw1234/1.txt 8 8 hdfs://cdh5/tmp/lxw1234/1.txt 10 1 hdfs://cdh5/tmp/lxw1234/1.txt 12
Hive查询中还包括:
Hive的内置操作和函数: http://superlxw1234.iteye.com/admin/blogs/2216500
Hive窗口分析函数:http://superlxw1234.iteye.com/admin/blogs/2205770
相关推荐
Hive JDBC允许Java应用作为客户端,与远程Hive服务端建立连接,执行SQL语句,包括创建表、加载数据、执行查询等操作。它提供了标准的JDBC接口,使得开发者可以使用熟悉的SQL语法与Hive进行交互,极大地简化了Hadoop...
5. 执行SQL语句,如`SELECT`, `INSERT`, `UPDATE`, `DELETE`等。 6. 处理查询结果,例如通过`ResultSet`对象获取数据。 7. 关闭`Statement`和`Connection`以释放资源。 Hive JDBC适用于各种场景,如ETL(提取、转换...
Apache Hive 是一个基于 Hadoop 的数据仓库工具,用于组织、查询和分析大量数据。它提供了一个SQL-like(HQL,Hive SQL)接口,使得非专业程序员也能方便地处理存储在Hadoop分布式文件系统(HDFS)中的大规模数据集...
HQL支持SELECT、FROM、WHERE、GROUP BY等标准SQL语句,同时也引入了分桶(Bucketing)、分区(Partitioning)和倾斜 join(Skewed Join)等特性以提高查询效率。 3. **表和分区**:Hive中的表可以被划分为多个分区...
Apache Hive 是一个基于 Hadoop 的数据仓库工具,它允许用户使用 SQL 类似的查询语言(HQL)来查询、管理和处理存储在 Hadoop 分布式文件系统(HDFS)中的大规模数据集。`apache-hive-1.2.2-bin.tar.gz` 是 Apache ...
Hive是Apache软件基金会开发的一个数据仓库工具,它允许用户使用SQL-like查询语言(HQL)来处理存储在Hadoop分布式文件系统(HDFS)上的大数据集。Hive-1.1.0-cdh5.7.0是Cloudera Data Hub (CDH)平台中的一个版本,...
Apache Hive 是一个基于Hadoop的数据仓库工具,它允许用户通过SQL-like的语言(称为HQL,Hive Query Language)对大规模数据集进行分析和查询。在本压缩包"apache-hive-1.2.1-bin.tar.zip"中,包含了Apache Hive ...
5. **优化器**:Hive 内置了一套查询优化器,根据元数据和查询语句来优化执行计划,如选择最佳的 join 策略或分区裁剪。 6. **执行引擎**:负责在 Hadoop 上执行由编译器生成的 MapReduce 作业。 在 `apache-hive-...
1. **Hive架构**:Hive将用户的SQL语句转换为MapReduce任务在Hadoop集群上执行,提供了一种将结构化数据文件映射为数据库表并提供简单的SQL查询功能的方式。 2. **元数据存储**:Hive使用MySQL或Derby等数据库存储...
Hive是Apache软件基金会开发的一个数据仓库工具,它允许用户使用SQL-like语言(HQL,Hive Query Language)对大规模存储在Hadoop分布式文件系统(HDFS)中的数据进行查询、分析和处理。Hive-1.1.0-cdh5.7.0是...
子查询,也被称为嵌套查询或内部查询,是在一个查询语句中嵌套另一个查询语句,用于获取主查询所需的数据。Hive中的子查询可以分为单行子查询、多行子查询以及关联子查询,它们在数据处理中扮演着关键角色。 1. **...
在大数据处理领域,Hive是一个基于Hadoop的数据仓库工具,它可以将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,使得用户能够通过SQL语句对存储在Hadoop分布式文件系统(HDFS)中的大数据进行分析。...
示例假设需要使用 SELECT 语句查询 employee 表和 department 表,按照 employee 表的 department_id 字段和 department 表的 id 字段连接。 hive> SELECT * FROM employee JOIN department ON employee.department...
例如,`CREATE TABLE`语句用于定义新的数据表,`LOAD DATA`用于将数据加载到表中,`SELECT`则用于查询数据。 3. **数据存储与表结构**: Hive中的数据通常存储在HDFS上,表可以分为Managed Table和External Table...
在Java编程环境中,调用Hive服务以执行SQL查询或数据操作是一项常见的任务。Hive是基于Hadoop的数据仓库工具,允许用户通过SQL接口(HQL)处理大规模数据集。为了在Java应用程序中与Hive交互,我们需要依赖特定的JAR...
此外,熟悉 HQL 的语法,如 SELECT、FROM、WHERE、JOIN 和 GROUP BY 语句,能够帮助他们更有效地查询和分析大数据。 Hive 的优势在于其可扩展性和容错性,得益于 Hadoop 的分布式特性。然而,由于 Hive 的查询执行...
Hive是建立在Hadoop生态系统之上,它将SQL语句转换为MapReduce任务执行,简化了大数据分析的过程。Hive中的表实质上是HDFS上的文件目录,每个表名对应一个目录,而分区表则会通过分区值形成子目录。Hive提供了类似于...
Hive处理HQL查询语句的解释、优化和查询计划生成,而Hadoop负责执行查询计划。Hive的所有数据存储在Hadoop的HDFS中。值得注意的是,Hadoop和Hive默认使用UTF-8编码。 ### Hive与传统关系数据库的异同 - **查询语言...
例如,你可以学习如何使用LOAD DATA命令将数据导入Hive表,使用SELECT语句进行基本查询,以及如何运用GROUP BY和JOIN操作来处理复杂的数据分析任务。此外,Hive支持UDF(用户自定义函数),这使得用户可以根据需要...