`
liyonghui160com
  • 浏览: 760503 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HiveQL介绍

阅读更多

 

Hive支持原子和复杂数据类型。原子数据类型包括数值型、布尔型和字符串类型,其中数值型有int / bigint / smallint / tinyint /double / float,布尔型为boolean,字符串类型为string。复杂数据类型包括数组(Array)、集合(Map)和结构(Struct)。Hive 还提供了大量的内置函数,诸如数学和统计函数、字符串函数、日期函数、条件函数、聚集函数等。当无法用Hive提供的内置函数来表示时,用户可以使用 UDF(用户自定义函数)。Hive中有三种UDF:UDF(普通)、UDAF(用户定义聚集函数)和UDTF(用户定义表生成函数)。

第一部分:DDL

Hive提供的DDL包含如下操作:

•建表

1)  建立内部表

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

[(col_name data_type [COMMENT col_comment], …)]

[COMMENT table_comment]

[PARTITIONED BY (col_name data_type [COMMENT col_comment], …)]

[CLUSTERED BY (col_name, col_name, ...)

[SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS]

[ROW FORMAT row_format]

[STORED AS file_format]

[LOCATION hdfs_path]

CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXIST 选项来忽略这个异常

EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION)

LIKE 允许用户复制现有的表结构,但是不复制数据

COMMENT可以为表与字段增加描述

STORED AS

SEQUENCEFILE

| TEXTFILE

| RCFILE

|INPUTFORMAT input_format_classname OUTPUTFORMAT             output_format_classname

如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCE 。

2)建立外部表

CREATE EXTERNAL TABLE page_view(viewTime INT, userid BIGINT,

page_url STRING, referrer_url STRING,

ip STRING COMMENT ‘IP Address of the User’,

country STRING COMMENT ‘country of origination’)

COMMENT ‘This is the staging page view table’

ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\054′

STORED AS TEXTFILE

LOCATION ‘<hdfs_location>’;

3)建立分区表

CREATE TABLE par_table(viewTime INT, userid BIGINT,

page_url  STRING, referrer_url STRING, ip STRING COMMENT ‘IP Address of the User’)

COMMENT ‘This is the page view table’

PARTITIONED BY(date STRING, pos STRING)

ROW FORMAT DELIMITED ‘\t’

FIELDS TERMINATED BY ‘\n’

STORED AS SEQUENCEFILE;

3)建Bucket表

CREATE TABLE par_table(viewTime INT, userid BIGINT,

page_url STRING, referrer_url STRING, ip STRING COMMENT ‘IP Address of the User’)

COMMENT ‘This is the page view table’

PARTITIONED BY(date STRING, pos STRING)

CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS

ROW FORMAT DELIMITED ‘\t’

FIELDS TERMINATED BY ‘\n’

STORED AS SEQUENCEFILE;

4)复制一个空表

CREATE TABLE empty_key_value_store

LIKE key_value_store;

 

•删除表

DROP TABLE table_name

 

•修改表结构

修改表结构操作包括增加分区、删除分区、重命名表、修改列的名字、类型、位置、注释及增加/更新列、增加表的元数据信息。

增加分区 ALTER TABLE table_name ADD [IF NOT EXISTS] partition_spec [ LOCATION 'location1' ]
删除分区 ALTER TABLE table_name DROP partition_spec, partition_spec,…
重命名表 ALTER TABLE table_name RENAME TO new_table_name
修改列的名字、类型、位置、注释 ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]
增加/更新列 ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], …)
增加表的元数据信息 ALTER TABLE table_name SET TBLPROPERTIES table_properties table_properties:

•改变表文件格式与组织

ALTER TABLE table_name SET FILEFORMAT file_format

ALTER TABLE table_name CLUSTERED BY(userid) SORTED BY(viewTime) INTO num_buckets BUCKETS

这个命令修改了表的物理存储属性。

•创建/删除视图

CREATE VIEW [IF NOT EXISTS] view_name [ (column_name [COMMENT column_comment], …) ][COMMENT view_comment][TBLPROPERTIES (property_name = property_value, ...)] AS SELECT
DROP VIEW view_name
如果没有提供表名,视图列的名字将由定义的SELECT表达式自动生成。

如果修改基本表的属性,视图中不会体现,无效查询将会失败。

视图是只读的,不能用LOAD/INSERT/ALTER。

•创建数据库

CREATE DATABASE name

•显示命令

show tables;

show databases;

show partitions ;

show functions

describe extended table_name dot col_name

 

DML包含如下操作:

•向数据表内加载文件

•LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
Load 操作只是单纯的复制/移动操作,将数据文件移动到 Hive 表对应的位置。

filepath

1.相对路径,例如:project/data1

2.绝对路径,例如: /user/hive/project/data1

3.包含模式的完整 URI,例如:hdfs://namenode:9000/user/hive/project/data1

•将查询结果插入到Hive表中

基本模式 INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement
多插入模式 FROM from_statement

INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1

[INSERT OVERWRITE TABLE tablename2 [PARTITION ...] select_statement2] ...

自动分区模式 INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement
将查询结果写入HDFS文件系统

 

INSERT OVERWRITE [LOCAL] DIRECTORY directory1 SELECT ... FROM ...

FROM from_statement

INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1

[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2]

INSERT INTO INSERT INTO  TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement

Hive的SQL操作

•基本的Select 操作

SELECT [ALL | DISTINCT] select_expr, select_expr, …

FROM table_reference

[WHERE where_condition]

[GROUP BY col_list [HAVING condition]]

[ CLUSTER BY col_list

| [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]

]

[LIMIT number]

1. 使用ALL和DISTINCT选项区分对重复记录的处理。默认是ALL,表示查询所有记录。DISTINCT表示去掉重复的记录。

2. Where 条件:类似我们传统SQL的where 条件

3. 0.9版本支持between,还不支持EXIST ,NOT EXIST

4. ORDER BY与SORT BY的不同:ORDER BY 全局排序,只有一个Reduce任务,SORT BY 只在本机做排序

Limit:Limit 可以限制查询的记录数,如:SELECT * FROM t1 LIMIT 5

 

•基于Partition的查询

如下面的查询语句:SELECT day_table.* FROM day_table WHERE day_table.dt>= ’2008-08-08′; dt是day_table表的分区字段。

Join语句

•Hive 只支持等值连接(equality joins)、外连接(outer joins)和(left semi joins)。Hive 不支持所有非等值的连接,因为非等值连接非常难转化到 map/reduce 任务

•LEFT,RIGHT和FULL OUTER关键字用于处理join中空记录的情况

•LEFT SEMI JOIN 是 IN/EXISTS 子查询的一种更高效的实现

•join 时,每次 map/reduce 任务的逻辑是这样的:reducer 会缓存 join 序列中除了最后一个表的所有表的记录,再通过最后一个表将结果序列化到文件系统

•实践中,应该把最大的那个表写在最后

join 查询时,需要注意几个关键点

•只支持等值join

•SELECT a.* FROM a JOIN b ON (a.id = b.id)

•SELECT a.* FROM a JOIN b

ON (a.id = b.id AND a.department = b.department)

•可以 join 多于 2 个表,例如

SELECT a.val, b.val, c.val FROM a JOIN b

ON (a.key = b.key1) JOIN c ON (c.key = b.key2)

•如果join中多个表的 join key 是同一个,则 join 会被转化为单个 map/reduce 任务

LEFT,RIGHT和FULL OUTER

•例子

•SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)

•如果你想限制 join 的输出,应该在 WHERE 子句中写过滤条件——或是在 join 子句中写

•容易混淆的问题是表分区的情况

• SELECT c.val, d.val FROM c LEFT OUTER JOIN d ON (c.key=d.key)

WHERE a.ds=’2010-07-07′ AND b.ds=’2010-07-07‘

•如果 d 表中找不到对应 c 表的记录,d 表的所有列都会列出 NULL,包括 ds 列。也就是说,join 会过滤 d 表中不能找到匹配 c 表 join key 的所有记录。这样的话,LEFT OUTER 就使得查询结果与 WHERE 子句无关

•解决办法

•SELECT c.val, d.val FROM c LEFT OUTER JOIN d

ON (c.key=d.key AND d.ds=’2009-07-07′ AND c.ds=’2009-07-07′)

LEFT SEMI JOIN

•LEFT SEMI JOIN 的限制是, JOIN 子句中右边的表只能在 ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行

•SELECT a.key, a.value

FROM a

WHERE a.key in

(SELECT b.key

FROM B);

可以被重写为:

SELECT a.key, a.val

FROM a LEFT SEMI JOIN b on (a.key = b.key)

UNION ALL

•用来合并多个select的查询结果,需要保证select中字段须一致

•select_statement UNION ALL select_statement UNION ALL select_statement …

 

 

第四部分:注意HiveQL区别于SQL的一些情况

SQL中对两表内联可以写成:

•select * from dual a,dual b where a.key = b.key;

Hive中应为

•select * from dual a join dual b on a.key = b.key;

分号字符

•分号是SQL语句结束标记,在HiveQL中也是,但是在HiveQL中,对分号的识别没有那么智慧,例如:

•select concat(key,concat(‘;’,key)) from dual;

但HiveQL在解析语句时提示:

FAILED: Parse Error: line 0:-1 mismatched input ‘<EOF>’ expecting ) in function specification

•解决的办法是,使用分号的八进制的ASCII码进行转义,那么上述语句应写成:

•select concat(key,concat(‘\073′,key)) from dual;

IS [NOT] NULL

•SQL中null代表空值, 值得警惕的是, 在HiveQL中String类型的字段若是空(empty)字符串, 即长度为0, 那么对它进行IS NULL的判断结果是False.

 

 

 

分享到:
评论

相关推荐

    HiveQL_UDF_函数V0.5.pdf

    hiveql udf函数大合集,详细介绍函数语法、操作类型、描述和应用举例等等,非常好用,大数据开发必备

    Scriptis:Scriptis用于交互式数据分析,包括脚本开发(SQL,Pyspark,HiveQL),任务提交(Spark,Hive),UDF,功能,资源管理和智能诊断

    圣经 英文|介绍Scriptis用于交互式数据分析,包括脚本开发(SQL,Pyspark,HiveQL),任务提交(Spark,Hive),UDF,功能,资源管理和智能诊断。产品特点脚本编辑器:支持多语言,自动完成,语法突出显示和SQL语法...

    hive编程指南中文

    《Hive编程指南》是一本Apache Hive的编程指南 旨在介绍如何使用Hive的SQL方法 HiveQL来汇总 查询和分析存储在Hadoop分布式文件系统上的大数据集合 全书通过大量的实例 首先介绍如何在用户环境下安装和配置Hive 并对...

    炼数成金 Hadoop 视频教程

    1.Hadoop的源起与体系介绍 2.Hadoop的源起与体系介绍 3.Hadoop的源起与体系介绍 4.实施Hadoop集群 5.实施Hadoop集群 6.实施Hadoop集群 7.分布式文件系统HDFS,大数据存储实战 8.分布式文件系统HDFS,大数据存储实战 ...

    Hadoop的源起与体系介绍

    能独立熟练完成Hadoop的安装及熟悉Hadoop的配置与管理  熟练地在Hadoop和操作系统以及关系型数据库之前传递数据  能独立制定数据集成方案  熟练地向Hadoop提交作业以及查询... 了解Hive的原理及进行HiveQL操作

    完整版大数据云计算课程 Hadoop数据分析平台系列课程 Hadoop 01 Hadoop介绍 共33页.pptx

    能独立熟练完成Hadoop的安装及熟悉Hadoop的配置与管理 熟练地在Hadoop和操作系统以及关系型数据库之前传递数据 能独立制定数据集成方案 熟练地向Hadoop提交作业以及查询作业运行情况 ...了解Hive的原理及进行HiveQL操作

    云计算大数据全套

    1.Hadoop的源起与体系介绍 2.实施Hadoop集群 3.分布式文件系统HDFS,大数据存储实战 4.hadoop高级应用 5.Pig安装与Pig Latin语言,应用案例 6.Hive体系架构安装与HiveQL应用案例 7.HBase体系架构与安装 8.HBase...

    hive编程指南中文版

    通过本书,读者可以很快学会如何使用Hive的SQL方言——HiveQL来汇总、查询和分析存储在Hadoop分布式文件系统上的大型数据集。 本书以实际案例为主线,详细介绍如何在用户环境下安装和配置Hive,并对Hadoop和...

    Hive编程指南

    通过本书,读者可以很快学会如何使用Hive的SQL方言——HiveQL来汇总、查询和分析存储在Hadoop分布式文件系统上的大型数据集。 本书以实际案例为主线,详细介绍如何在用户环境下安装和配置Hive,并对Hadoop和...

    大数据学习笔记

    第28章 HIVEQL 102 28.1 查询语句(SELECT ...WHERE) 102 28.1.1 查询语句实例 102 28.1.2 JDBC查询语句实例 102 28.2 查询语句(SELECT...ORDER BY) 103 28.2.1 ORDER BY查询语句实例 103 28.2.2 JDBC ORDER BY 查询...

    Hive指南.docx

    Hive指南,介绍如何使用Hive的SQL方法--HiveQL汇总、查询和分析存储在Hadoop上的的大数据集合。

    Hive编程指南(扫描版)

    Hive编程指南是一本ApacheHive的编程指南,旨在介绍如何使用Hive的SQL方法——HiveQL来汇总、查询和分析存储在Hadoop分布式文件系统上的大数据集合。

    SparkSql和DataFrame实战.docx

    文档主要介绍了环境搭建和配置使用 1. 什么是Spark SQL Spark SQL的一个用途是执行使用基本SQL语法或HiveQL编写的SQL查询。Spark SQL还可以用于从现有的Hive安装中读取数据。有关如何配置此功能的更多信息,请参考...

    Hive编程指南.pdf

    《Hive编程指南》是一本Apache Hive的编程指南,旨在介绍如何使用Hive的SQL方法HiveQL来汇总、查询和分析存储在Hadoop分布式文件系统上的大数据集合。全书通过大量的实例,首先介绍如何在用户环境下安装和配置Hive,...

    Hive编程PDF

    《Hive编程指南》是一本ApacheHive的编程指南,旨在介绍如何使用Hive的SQL方法——HiveQL来汇总、查询和分析存储在Hadoop分布式文件系统上的大数据集合。《Hive编程指南》通过大量的实例,首先介绍如何在用户环境下...

    HIVE编程指南

    《Hive编程指南》是一本ApacheHive的编程指南,旨在介绍如何使用Hive的SQL方法——HiveQL来汇总、查询和分析存储在Hadoop分布式文件系统上的大数据集合。《Hive编程指南》通过大量的实例,首先介绍如何在用户环境下...

    WeDataSphere:WeDataSphere是用于大数据平台的财务级别的一站式开源手提箱。 目前,Scriptis和Linkis的源代码已经发布到开源社区。 WeDataSphere,轻松实现大数据!-one source code

    与计算/存储引擎(Spark,Flink,Hive,Python和HBase)连接,公开REST / WS接口,并执行多语言作业(SQL,Pyspark,HiveQL和Scala)作为数据中间件。 到Github仓库 用于交互式数据分析,包括脚本开发(SQL,Pyspark...

Global site tag (gtag.js) - Google Analytics