大数据开发实战:Hive表DDL和DML
1、Hive 表 DDL
1.1、创建表
Hive中创建表的完整语法如下:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[ (col_name data_type [COMMET 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], . . . ) INFO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
CREATE TABLE:用于创建一个指定名称的表,如果相同名字的表已经存在,则抛出异常,可以用 IF NOT EXISTS选项来忽略这个异常。
EXTERNAL:该关键字可以让用户创建一个外部表,在创建表的同时指定一个指向实际数据的的路径(LOCATION).
COMMENT:可以为表和字段增加注释
ROW FORMAT:用户在建表的时候可以自定义SerDe或者使用自带的SerDe。如果没有指定的ROW FORMAT或者ROW FORMAT DELIMITED,将会使用自带的SerDe;在创建表时,用户还需要为表指定列,同时也会指定
自定义的SerDe。Hive通过SerDe确定表的具体的列的数据。Serde是 Serializer/Deserializer的简写。hive使用Serde进行行对象的序列与反序列化。
一条简单的建表语句如下:
hive> CREATE TABLE gripe(foo INT, bar STRING);
Like:允许用户复制现有的表结构,但是不复制数据。例如:
hive>CREATE TABLE empty_key_value_store LIKE key_value_store
另外还可以通过CREATE TABLE AS SELECT的方式来创建表,例如:
hive>CREATE TABLE new_key_value_store
ROW FORMAT SERDE "org.apache.Hadoop.hive.serde2.columnar.ColumnarSerDe" STORED AS RCFile
AS
SELECT (key % 1024) new_key , concat(key, value) key_value_pair
FROM key_value_store
SORT BY new_key, key_value_pair;
1.2、修改表
修改表名的语法如下:
hive> ALTER TABLE old_table_name RENAME TO new_table_name;
修改列名的语法如下:
hive>ALTER TABLE table_name CHANGE [COLUMN] old_col_name new_col_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]
上述语法允许改变列名、数据类型、注释、列位置或者它们的任意组合。建表后如果需要增加一列,则使用如下语法:
hive>ALTER TABLE gripe ADD COLUMNS (new_col INT COMMENT 'new col comment');
1.3、删除表
DROP TABLE 语句用于删除表的数据和元数据。对应外部表,只删除Metastore中的元数据,而外部数据保存不动,例如:
drop table my_table;
如果只想删除表数据,保留表结构,跟MYSQL类似,使用TRUNCATE语句。
TRUNCATE TABLE my_table;
1.4、插入表
1、向表中加载数据
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INFO TABLE tablename [PARTITION(partcol1 = val1, partcol2 = val2, . . .)]
Load操作只是单纯的复制/移动操作,将数据 文件移动到Hive表对应的位置,filepath可以是相对路径,例如project/data1, 也可以是绝对路径,例如:/user/hive/project/data1, 或是包含模式的完整URI,例如:
hdfs://namenode:9000/user/hive/project/data1。
相对路径实例如下:
hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE gripe;
2、将查询结果插入Hive表
将查询结果写入HDFS文件系统。
a、基本模式:
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1 = val1, partcol2 = val2, . . .)]
select_statements FROM from_statement
b、多插入模式:
INSERT OVERWRITE TABLE tablename1
[PARTITION (partcol1 = val1, partcol2 = val2, . . . )]
select_statement1
[ INSERT OVERWRITE TABLE tablename2 [PARTITION . . . ] select_statement2] . . .
c、自动分区模式:
INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] . . . )
select_statement From from_statement
2、Hive 表 DML
1、基本的select操作
Hive中的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]
ALL和DISTINCT:选项区分对重复记录的处理。默认是ALL,表示查询所有记录。DISTINCT表示去掉重复记录。
WHERE条件:类似于传统的SQL的where条件,支持 AND 、OR、BETWEEN、IN、NOT IN等。
ORDER BY与SORT BY的不同:ORDER BY指全局排序,只有一个Reduce任务,而SORT BY只在本机做排序。
LIMIT:可以限制查询的记录条数,例如:SELECT * FROM t1 LIMIT 5, 也可以实现Top k查询,比如下面的查询语句可以查询销售记录最多的5个销售代表:
SET mapred.reduce.tasks = 1
SELECT * FROM test SORT BY amount DESC LIMIT 5
REGEX Column Specification:select 语句可以使用正则表达式做列选择,下面的语句查询除了ds和hr之外的所有列
SELECT '(ds|hr)?+.+' FROM test
2、join表
Hive中join表的语言如下:
join_table:
table_reference [INNER] JOIN table_factor [join_condition]
| table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition
| table_reference LEFT SEMI JOIN table_reference join_condition
|table_reference CROSS JOIN table_reference [join_condition] (as of Hive 0.10)
table_reference:
table_factor
| join_table
table_factor:
tbl_name [alias]
| table_subquery alias
| (table_references)
join_confition:
On expression
对Hive中表Join操作的说明以及注意事项如下:
1、Hive只支持等值连接、外连接和左半连接(left semi join),Hive 不支持所有的非等值连接,因为非等值连接很难转化到map/reduce任务(从2.2.0版本后开始支持非等值连接)。
2、可以连接2个以上的表,例如:
SELECT a.val, b.val, c.val FROM a JOIN b on (a.key = b.key1) JOIN c on (c.key = b .key2)
3、如果连接中多个表的join key是同一个,则连接会转化为单个Map/Reduce任务,例如:
SELECT a.val, b.val, c.val FROM a JOIN b on (a.key = b.key1) JOIN c on (c.key = b .key1)
4、join时大表放在最后。这是因为每次Map/Reduce任务的逻辑是这样的:Reduce会缓存join序列中除最后一个表之外的所有表的记录,再通过最后一个表将将结果序列化文件系统,因此在实践中,应该把最大的那个表写在最后。
5、如果想限制join的输出,应该在where子句中写过滤条件,或是在join子句中写,但是表分区的情况很容易混淆,比如下面的第一个SQL语句所示,如果d表中找不到对应c表的记录,d表的所有列都会列出NULL,包括ds列,
也就是说,join会过滤d表中不能找到 c表join key 的所有记录。这样,LEFT OUTER 就使得查询结果与WHERE子句无关,解决办法是在join时指定分区(如下面的第二个SQL语句)。
//第一个SQL语句
SELECT c.val, d.val FROM c LEFT OUTER JOIN d ON (c.key = d.key) where c.ds = '2010-08-08' AND d.ds ='2010-08-08'
//第一个SQL语句
SELECT c.val, d.val FROM c LEFT OUTER JOIN d ON (c.key = d.key AND c.ds = '2010-08-08' AND d.ds ='2010-08-08')
6、LEFT SEMI JOIN是IN/EXISTS子查询的一种更高效的实现。其限制是:JOIN子句中右边的表只能在On子句中设置过滤条件,在WHERE子句、SELECT子句、或其他地方过滤都不行。
SELECT a.key, a.value FROM a WHERE a.key in (SELECT b.key FROM b);
可以被重写为:SELECT a.key, a.value FROM a LEFT SEMI JOIN b on (a.key = b.key)
参考资料:《离线和实时大数据开发实战》
大数据开发实战:Hive表DDL和DML的更多相关文章
- 大数据开发实战:Hive优化实战3-大表join大表优化
5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个具体的问题场景,然后基于此介绍各自优 ...
- 大数据开发实战:Hive优化实战2-大表join小表优化
4.大表join小表优化 和join相关的优化主要分为mapjoin可以解决的优化(即大表join小表)和mapjoin无法解决的优化(即大表join大表),前者相对容易解决,后者较难,比较麻烦. 首 ...
- 大数据开发实战:Hive优化实战1-数据倾斜及join无关的优化
Hive SQL的各种优化方法基本 都和数据倾斜密切相关. Hive的优化分为join相关的优化和join无关的优化,从项目的实际来说,join相关的优化占了Hive优化的大部分内容,而join相关的 ...
- 大数据开发实战:离线大数据处理的主要技术--Hive,概念,SQL,Hive数据库
1.Hive出现背景 Hive是Facebook开发并贡献给Hadoop开源社区的.它是建立在Hadoop体系架构上的一层SQL抽象,使得数据相关人员使用他们最为熟悉的SQL语言就可以进行海量数据的处 ...
- 大数据开发实战:Stream SQL实时开发一
1.流计算SQL原理和架构 流计算SQL通常是一个类SQL的声明式语言,主要用于对流式数据(Streams)的持续性查询,目的是在常见流计算平台和框架(如Storm.Spark Streaming.F ...
- 大数据开发实战:Spark Streaming流计算开发
1.背景介绍 Storm以及离线数据平台的MapReduce和Hive构成了Hadoop生态对实时和离线数据处理的一套完整处理解决方案.除了此套解决方案之外,还有一种非常流行的而且完整的离线和 实时数 ...
- 大数据开发实战:Stream SQL实时开发三
4.聚合操作 4.1.group by 操作 group by操作是实际业务场景(如实时报表.实时大屏等)中使用最为频繁的操作.通常实时聚合的主要源头数据流不会包含丰富的上下文信息,而是经常需要实时关 ...
- 大数据开发实战:Stream SQL实时开发二
1.介绍 本节主要利用Stream SQL进行实时开发实战,回顾Beam的API和Hadoop MapReduce的API,会发现Google将实际业务对数据的各种操作进行了抽象,多变的数据需求抽象为 ...
- 大数据开发实战:Hadoop数据仓库开发实战
1.Hadoop数据仓库架构设计 如上图. ODS(Operation Data Store)层:ODS层通常也被称为准备区(Staging area),它们是后续数据仓库层(即基于Kimball维度 ...
随机推荐
- [USACO3.2]Sweet Butter
题目大意: 给定一张$k$个结点,$m$条边的无向图,其中有$n$个点被标记,在这$k$个点中找出一个点使得这个点到那$n$个点的最短距离之和最小,求出这个距离和. 思路: 对于每个标记结点跑最短路, ...
- 钻牛角尖还是走进死胡同--shell脚本根据名称获得 dubbo 服务的 pid
到了下午,突然觉得坐立不安,可能是因为中午没有休息好.老大不小了还在做页面整合的事情,这是参加工作时就干的工作了.然后突然想去挑战高级一点的缺陷排查,结果一不小心就钻了一个牛角尖.启动 dubbo 服 ...
- 洛谷P1133 教主的花园
题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树 ...
- [Java]Spring框架
在这里学习Spring框架: >>spring&struts框架学习 >>spring >>Java回顾之Spring基础 >>IBM Java ...
- spring-boot 速成(3) actuator
actuator 通过暴露一系列的endpoints可以让开发者快速了解spring boot的各项运行指标,比如:线程数,jvm剩余内存等一系列参数. 启用方法很简单,参考下面: dependenc ...
- windows和linux 下将tomcat注册为服务
参考文献: tomcat注册成windows服务 背景 当前项目需要运行两个Tomcat,每次启动系统以后都要手动进入到tomcat目录执行startup.bat,非常烦,所以想将这两个tomcat直 ...
- delphi 服务程序
http://www.delphifans.com/InfoView/Article_662.html 用Delphi创建服务程序 Windows 2000/XP和2003等支持一种叫做"服 ...
- 在ASP.NET MVC中使用Castle Windsor
平常用Inject比较多,今天接触到了Castle Windsor.本篇就来体验其在ASP.NET MVC中的应用过程. Visual Studio 2012创建一个ASP.NET MVC 4网站. ...
- 标记 {x:Null},d:DesignWidth,d:DesignHeight
{x:Null}:用于设置某属性值为Null,比如<Rectangle Fill="{x:Null}" />,其实就相当于<Rectangle />,个人感 ...
- How to update jQuery Mobile in Dreamweaver CS6
来源:http://wpguru.co.uk/2013/01/how-to-update-jquery-mobile-in-dreamweaver-cs6/ Since the release of ...