文档章节

Hive最新数据操作

hblt-j
 hblt-j
发布于 2017/08/29 15:09
字数 3180
阅读 17
收藏 0
点赞 0
评论 0

数据操作能力是大数据分析至关重要的能力。数据操作主要包括:更改(exchange),移动(moving),排序(sorting),转换(transforming)。Hive提供了诸多查询语句,关键字,操作和方法来进行数据操作。一、 数据更改 数据更改主要包括:LOAD, INSERT, IMPORT, and EXPORT1. LOAD DATA load关键字的作用是将数据移动到hive中。如果是从HDFS加载数据,则加载成功后会删除源数据;如果是从本地加载,则加载成功后不会删除源数据。
数据:employee_hr.txt http://pan.baidu.com/s/1c0D9TpI
例:
hive>(不用输入,在此表示在Hive的shell输入以下命令,下同) CREATE TABLE IF NOT EXISTS employee_hr( name string, employee_id int, sin_number string, start_date timestamp ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' STORED AS TEXTFILE;

例: Hive> LOAD DATA LOCAL INPATH '/apps/ca/yanh/employee_hr.txt' OVERWRITE INTO TABLE employee_hr;

\


注1:在指令中LOCAL关键字用于指定数据从本地加载,如果去掉该关键字,默认从HDFS进行加载! OVERWRITE关键字指定使用覆盖方式进行加载数据,否则使用附加方式进行加载。

注2:如果数据加载到分区表,则必须指定分区列。

\\

2. INSERT 同RDBMS一样,hive也支持从其他hive表提取数据插入到指定表,使用INSERT关键字。INSERT操作是Hive数据处理中最常用的将已有数据填充进指定表操作。在Hive中,INSERT可以和OVERWRITE一起使用实现覆盖插入,可以进行多表插入,动态分区插入以及提取数据至HDFS或本地。

例: hive> CREATE TABLE ctas_employee AS SELECT * FROM employee; TRUNCATE TABLE employee; //删除employee中的数据,保留表结构

\

例:

hive> INSERT INTO TABLE employee SELECT * FROM ctas_employee; 

\\ 

注:这里使用Hive提供的beeline工具进行连接,以便清晰的显示数据表。

例:从CTE插入数据 hive> WITH a AS (SELECT * FROM ctas_employee) FROM a INSERT OVERWRITE TABLE employee SELECT *; //效果和上例相同 注:Hive从0.13.0版本开始支持CTE

例:多表插入 hive> CREATE TABLE employee_internal LIKE employee; FROM ctas_employee INSERT OVERWRITE TABLE employee SELECT * INSERT OVERWRITE TABLE employee_internal SELECT *; SELECT * FROM employee_internal;

\

Hive除了支持向静态分区插入静态数据,还支持插入动态数据,如日期
例:动态分区插入 动态分区默认是关闭的,可通过以下设置开启:SET hive.exec.dynamic.partition=true; Hive默认至少需要一个partition列是静态的,可以通过以下设置关闭:SET hive.exec.dynamic.partition.mode=nonstrict; hive> INSERT INTO TABLE employee_partitioned PARTITION(year,month) SELECT name,array('Toronto') AS work_place, named_struct("sex","Male","age",30) AS sex_age, map("Python",90) AS skills_score, map("R&D",array('Developer')) AS depart_title, year(start_date) AS year, month(start_date) AS month FROM employee_hr eh WHERE eh.employee_id = 102;
例:

hive> SELECT * FROM employee_partitioned;

 \

例:提取数据至本地(默认使用^A分离列,换行符分离行) 注:Hive提取数据只能使用OVERWRITE, 不能使用INTO。 

注:在一些Hadoop版本中目录深度只支持到2层,可以使用以下设置修复:SET hive.insert.into.multilevel.dirs=true; hive> INSERT OVERWRITE LOCAL DIRECTORY '/apps/ca' SELECT * FROM employee;

\\ 

注:默认下Hive会将数据按reducer数量生成多个输出文件,可以使用以下命令进行合并: hdfs dfs -getmerge hdfs://:port/user/output/directory

例:使用特定分隔符分隔行 hive> INSERT OVERWRITE LOCAL DIRECTORY '/apps/ca/yanh/data' ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' SELECT * FROM employee;

\

 

例:Hive同样能多目录输出文件 hive> FROM employee INSERT OVERWRITE LOCAL DIRECTORY '/apps/ca/yanh/data1' SELECT * INSERT OVERWRITE LOCAL DIRECTORY '/apps/ca/yanh/data2' SELECT * ;

\


3. EXPORT and IMPORT 这两条命令是Hive用来和HDFS进行数据迁移或者进行数据备份的,从Hive0.8.0开始可用。EXPORT可以导出数据以及元数据到HDFS,元数据被命名为_metadata. 数据被放在命名为data的目录下

例: hive>
 

EXPORT TABLE employee TO '/apps/ca/yanh/data';

 \\


注:输出目录不能已存在

例:将输出的数据导入Hive(将数据导入到已有的表将报错) hive>
 

IMPORT FROM '/apps/ca/yanh/data';

 \


例:导入到新表(也可以是EXTERNAL表) hive>
 

IMPORT TABLE employee_imported FROM '/apps/ca/yanh/data'; 

\\


例:partition表导入导出 hive>
 

EXPORT TABLE employee_partitioned PARTITION (year=2015,month=05) TO '/apps/ca/yanh/data1';

\


例:

hive>
 

IMPORT TABLE employee_partitioned_imported FROM '/apps/ca/yanh/data1'; 

\


二、 数据排序 数据排序主要包括:ORDER, and SORT. 该操作同样经常使用,以便生成已排序表从而进行后面的包括top N, maximum, minimum等取值操作。 主要操作包括ORDER BY (ASC|DESC)、SORT BY(ASC|DESC)、DISTRIBUTE BY、CLUSTER BY

1. ORDER BY (ASC|DESC) 跟RDBMS的ORDER BY操作类似,该操作输出一个全局排序的结果,因此reducer的输出结果仅有一个,所以如果大数据量下过程是十分漫长的!这时可以时候LIMIT关键字提高输出效率。如果Hive设置hive.mapred.mode = strict,那LIMIT关键字将不可使用(默认是可以使用的)。

例:按名字从大到小排序(如果数据量大,可以在最后加上LIMIT n来显示前n行) hive>
 

SELECT name FROM employee ORDER BY name DESC; 

\


2. SORT BY(ASC|DESC) 与ORDER BY (ASC|DESC)操作不同,SORT BY(ASC|DESC)操作仅输出局部有序的结果(即多个reducer输出,每个输出有序)。如果要输出全局有序,可以通过SET mapred.reduce.tasks=1;来制定reducer个数为1. 此时效果与ORDER BY (ASC|DESC) 相同。SORT BY指定列排序,可以在数据从mapper端全部传入之前完成排序(只要该列传输完毕)。

例: hive>
 

SET mapred.reduce.tasks=2; SELECT name FROM employee SORT BY name DESC; 

\ 

设置2个reducer,可以看到结果并不是从大到小排列的。

例: hive>
 

SET mapred.reduce.tasks=1; SELECT name FROM employee SORT BY name DESC; 

\ 

设置1个reducer,此时与ORDER BY结果相同!


3. DISTRIBUTE BY 该操作类似于RDBMS中的GROUP BY,根据制定的列将mapper的输出分组发送至reducer,而不是根据partition来分组数据。 注:如果使用了SORT BY,那么必须在DISTRIBUTE BY之后,且要分发的列必须出现在已选择的列中(因为SORT BY的性质)。

例:为选择employee_id,出错 hive>
 

SELECT name FROM employee_hr DISTRIBUTE BY employee_id; 

\

 

例: hive> SELECT name,employee_id FROM employee_hr DISTRIBUTE BY employee_id SORT BY name;

\


4. CLUSTER BY CLUSTER BY类似于DISTRIBUTE BY和SORT BY的组合作用(作用于相同列),但不同于ORDER BY的是它仅在每个reducer进行排序,而不是全局排序,且不支持ASC和DESC。如果要实现全局排序,可以先进行CLUSTER BY然后再ORDER BY。
 

例: hive> SELECT name, employee_id FROM employee_hr CLUSTER BY name;

\

ORDER BY和CLUSTER BY不同之处如下图所示:

 \


三、 数据操作和方法 为了更进一步的数据操作,我们可以对Hive进行诸如表达式、操作、方法等来对数据进行转换。在Hive wiki https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF上已经对每一个表达式和方法进行了规范。同时Hive也已经定义了一些关系型的操作、算术运算操作、逻辑运算操作、复杂类型构造器以及复杂类型操作。对于其中的关系型的操作、算术运算操作、逻辑运算操作而言,和SQL/Java中的标准操作比较类似。 Hive中的方法大致可以分为以下几类:数学函数:这些方法主要用于数学计算,如RAND()何E().
汇总函数:这些方法主要用于对复杂类型进行size、key、value等的查询,如SIZE(Array).
类型转换函数:这些方法主要用于对数据类型进行转换,如CAST和BINARY.
日期函数:用于对日期相关进行操作,如YEAR(string date)和MONTH(string date).
条件函数:用于返回特定条件过滤后的函数,如COALESCE、IF、和CASE WHEN.
字符串函数:此类函数主要用于字符串相关操作,如UPPER(string A) 和TRIM(string A).
聚合函数:此类函数主要用于数据聚合,如SUM(),COUNT(*).
列表生成函数:此类函数主要用于将单行输入转换为多行输出,如EXPLODE(MAP)和JSON_TUPLE(jsonString, k1, k2, ...).
自定义函数:此类由Java生成的函数作为Hive的扩展函数对Hive功能进行扩展.
可以在Hive CLI使用以下语句进行Hive内建函数查询: SHOW FUNCTIONS; //列出Hive所有函数 DESCRIBE FUNCTION ; //函数详细描述 DESCRIBE FUNCTION EXTENDED ; //更多详细信息
详细样例:
1. 复杂数据类型函数提示:SIZE函数用于计算MAP、ARRAY或嵌套MAP/ARRAY。如果size未知则返回-1.

例: hive> SELECT work_place, skills_socre, depart_title FROM employee; 

\

例: hive> SELECT SIZE(work_place) AS array_size, SIZE(skills_score) AS map_size, SIZE(depart_title) AS complex_size, SIZE(depart_title["Product"]) AS nest_size FROM employee;

\

ARRAY_CONTAINS声明用于使用TRUE或FALSE返回值检验指定列是否包含指定值。SORT_ARRAY声明用于对数组进行升序排序。

例: hive> SELECT ARRAY_CONTAINS(work_place, 'Toronto') AS is_Toronto, SORT_ARRAY(work_place) AS sorted_array FROM employee;

\

2. 日期函数提示:FROM_UNIXTIME(UNIX_TIMESTAMP())声明与Oracle中的SYSDATE函数相同,动态返回Hive服务器的当前时间。

例: hive> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP()) AS current_time FROM employee limit 1;

\

TO_DATE用于将获取的系统时间截取日期

例: hive> SELECT TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP())) AS current_date FROM employee limit 1;

\

3. 多种不同数据类型的CASE:在Hive0.13.0版本之前THEN或者ELSE后面的数据类型必须相同。否则可能会产生异常值,如ELSE后的数据类型必须同THEN。此问题在0.13.0之后得到修复。

例:由于数据类型不同造成异常返回 hive> SELECT CASE WHEN 1 IS NULL THEN 'TRUE' ELSE 0 END AS case_result FROM employee LIMIT 1;

\

4. 解析和查找:LATERAL VIEW是用来生成用户自定义表以展开的形式显示map或array的值,如同EXPLODE(),但其会忽略值为NULL的列,如果要显示这些列,可以使用LATERAL VIEW OUTER(Hive0.12.0之后版本)

例: hive> INSERT INTO TABLE employee SELECT 'Steven' AS name, array(null) AS work_place, named_struct("sex","Male","age",30) AS sex_age, map("Python", 90) AS skills_score, map("R&D",array('Developer')) AS depart_title FROM employee LIMIT 1; SELECT name, work_place, skills_score FROM employee; 

\

例: hive> SELECT name, workplace, skills, score FROM employee LATERAL VIEW explode(work_place) wp AS workplace LATERAL VIEW explode(skills_score) ss AS skills, score;

\

例: hive> SELECT name, workplace, skills, score FROM employee LATERAL VIEW OUTER explode(work_place) wp AS workplace LATERAL VIEW explode(skills_score) ss AS skills, score;

\

REVERSE用于将指定字符串进行反转,SPLIT用于将字符串按指定分隔符进行分隔。

例: hive> SELECT reverse(split(reverse('/apps/ca/yanh/employee.txt'),'/')[0]) AS linux_file_name FROM employee LIMIT 1;

\

REVERSE将输出转换为单独元素,而COLLECT_SET和COLLECT_LIST则是反过来将元素组合成集合进行输出。COLLECT_SET和COLLECT_LIST的不同在COLLECT_SET返回的集合不含重复元素,而COLLECT_LIST则可以包含重复元素。

例: hive> SELECT collect_set(work_place[0]) AS flat_wprkplace FROM employee;

\

例:

hive> SELECT collect_list(work_place[0]) AS flat_wprkplace FROM employee; 

\ 

注:Hive0.11.0及以前不支持collect_list

5. 虚拟列:虚拟列是Hive中特殊的列的特殊函数类型。目前为止Hive仅支持2个虚拟列:INPUT_FILE_NAME和BLOCK_OFFSET_INSIDE_FILE。INPUT_FILE_NAME列是mapper的输入文件名,BLOCK_OFFSET_INSIDE_FILE是当前全部文件位置或当前压缩文件的块偏移量。
例: hive> SELECT INPUT_FILE_NAME, BLOCK_OFFSET_INSIDE_FILE AS OFFSIDE FROM employee_id; 注:在Hive0.13.0上测试失败,没有该函数。
6. wiki未提到的函数:

例:isnull,用于检验值是否为空 hive> SELECT work_place, isnull(work_place) is_null, isnotnull(work_place) is_not_null FROM employee;

\

例:assert_true,如果条件为false时抛出异常 hive> SELECT assert_true(work_place IS NULL) FROM employee;

\

例:elt,返回第n个字符串 hive> SELECT elt(2, 'New York', 'Beijing', 'Toronto') FROM employee LIMIT 1;

\

例:current_database,返回当前数据库名 hive> SELECT current_database();

\ 

注:Hive0.11.0及以前没有此函数

四、 数据转换 在Hive0.13.0以前不支持行级的数据转换。因此,数据行的更新、插入、删除都不能实现。因此数据重写只能发生在表或者分区,这使得Hive很难处理并发读写和数据清洗的情况。但是从0.13.0开始,Hive提供了原子性、一致性、隔离性和持久性(ACID)的行级数据处理功能。如今所有的转换操作支持ORC(优化排柱状,从Hive0.11.0开始支持)文件和桶列表中的数据。
以下配置参数需要适当的配置以开启Hive的转换功能: SET hive.support.concurrency = true; SET hive.enforce.bucketing = true; SET hive.exec.dynamic.partition.mode = nonstrict; SET hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; SET hive.compactor.initiator.on = true; SET hive.compactor.worker.threads = 1;
SHOW TRANSACTIONS可以对当前已开启的转换操作进行查询: hive> SHOW TRANSACTIONS;
从Hive0.14.0开始,行级插入数值、更新和删除可以使用以下语法规则进行实现: INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row …]; UPDATE tablename SET column = value [, column = value…] [WHERE expression]; DELETE FROM tablename [WHERE expression];

 

结语 以上便是全部Hive的关于数据的具体操作,相信到此为止应该能对Hive的常规数据操作进行较为得心应手的使用了吧。以上有截图的用例均由本人亲测可行,测试环境为Hive0.11.0,部分Hive0.13.0的特性是在0.13.0下进行测试,在截图下均有说明。

本文转载自:http://blog.csdn.net/dxl342/article/details/70842839

共有 人打赏支持
hblt-j
粉丝 14
博文 92
码字总数 11113
作品 0
海淀
架构师
Impala 表使用 Avro 文件格式(翻译)

Impala 表使用 Avro 文件格式 Cloudera Impala 支持数据文件使用 Avro 文件格式的表。Impala 可以查询 Avro 表,但目前不支持创建和插入数据。对于这些操作,使用 Hive 处理,然后切换回 Im...

weiqingbin ⋅ 2014/01/20 ⋅ 0

【R】CentOS7下Rstudio实践初探及遇到的问题 二(连接hive)

缘起 连接hive,似乎在网络上已经找不到正确的配置和下载了。 因此只能根据官方的来。 分析 首先直接install package的时候,编译RHive,提示找不到。但提示找到一个HiveR的包。 那然后直接安...

lsttoy ⋅ 2017/01/12 ⋅ 0

MySQL推出Applier,可实时复制数据到Hadoop

MySQL复制操作可以将数据从一个MySQL服务器(主)复制到其他的一个或多个MySQL服务器(从)。试想一下,如果从服务器不再局限为一个MySQL服务器,而是其他任何数据库服务器或平台,并且复制事...

cookqq ⋅ 2014/03/07 ⋅ 0

CDH5.0.2安装HBase Phoenix4.2

博客园 首页 新随笔 联系 订阅 管理 最新随笔 最新评论 CDH5.0.2安装HBase Phoenix4.2 Posted on 2014-11-21 10:57 libobo1984 阅读(462) 评论(0) 编辑 收藏   由于目前公司大量的数据存储...

Zero零_度 ⋅ 2016/10/18 ⋅ 0

数据仓库Hive管理软件--phpHiveAdmin

这是一个由php编写的hadoop hive查询工具,可以方便的查询hive中的数据和相关信息。本软件遵循GPL3许可协议 下载当前版本,请访问phpHiveAdmin @ github.com获取最新源码 EasyHadoop。访问w...

Slaytanic ⋅ 2012/02/19 ⋅ 0

在集群上安装Hive

1、先决条件 要求必须已经安装完成Hadoop,Hadoop的安装在之前的博文《VMware下Hadoop 2.4.1完全分布式集群平台安装与设置》有详细介绍过。 2、下载Hive安装包 当前最新版本为0.13.1,可以到...

dwf07223 ⋅ 2014/10/16 ⋅ 0

【Hadoop】Hadoop2.7.3安装Hive 2.1.0

原创文章,转载请标注来自http://blog.csdn.net/lsttoy/article/details/53406710。 第一步: 下载最新的hive,直接去apache 里面找hive2.1.0下载就行。 第二步,解压到服务器 第三步,修改c...

lsttoy ⋅ 2016/11/30 ⋅ 0

【干货】Apache Hive 2.1.1 安装配置超详细过程,配置hive、beeline、hwi、HCatalog、WebHCat等组件...

在Docker环境成功搭建了Apache Hadoop 2.8 分布式集群,并实现了NameNode HA、ResourceManager HA之后(详见我的另一篇博文:Apache Hadoop 2.8分布式集群详细搭建过程),接下来将搭建最新稳...

implok ⋅ 04/13 ⋅ 0

【干货】Apache Hive 2.1.1 安装配置超详细过程,配置hive、beeline、hwi、HCatalog、WebHCat等组件

在Docker环境成功搭建了Apache Hadoop 2.8 分布式集群,并实现了NameNode HA、ResourceManager HA之后(详见我的另一篇博文:Apache Hadoop 2.8分布式集群详细搭建过程),接下来将搭建最新稳...

雪饼 ⋅ 2017/06/28 ⋅ 2

(第7篇)灵活易用易维护的hadoop数据仓库工具——Hive

Hive hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询...

I加加 ⋅ 2017/03/13 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部