Hive最新数据操作详解(超级详细)

来源:互联网 发布:最新网络红歌排行榜 编辑:程序博客网 时间:2024/04/29 19:35

数据操作能力是大数据分析至关重要的能力。数据操作主要包括:更改(exchange),移动(moving),排序(sorting),转换(transforming)。Hive提供了诸多查询语句,关键字,操作和方法来进行数据操作。

数据:employee_hr.txt http://pan.baidu.com/s/1c0D9TpI
原文链接:http://blog.csdn.net/yhao2014/article/details/46312469

一、 数据更改

数据更改主要包括:LOAD, INSERT, IMPORT, and EXPORT

  1. LOAD DATA
  2. INSERT
  3. EXPORT and IMPORT

二、 数据排序

数据排序主要包括: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关键字将不可使用(默认是可以使用的)。
  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端全部传入之前完成排序(只要该列传输完毕)。
  3. DISTRIBUTE BY
    该操作类似于RDBMS中的GROUP BY,根据制定的列将mapper的输出分组发送至reducer,而不是根据partition来分组数据。
    注:如果使用了SORT BY,那么必须在DISTRIBUTE BY之后,且要分发的列必须出现在已选择的列中(因为SORT BY的性质)。
  4. CLUSTER BY
    CLUSTER BY类似于DISTRIBUTE BY和SORT BY的组合作用(作用于相同列),但不同于ORDER BY的是它仅在每个reducer进行排序,而不是全局排序,且不支持ASC和DESC。如果要实现全局排序,可以先进行CLUSTER BY然后再ORDER 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.
  2. 日期函数提示:FROM_UNIXTIME(UNIX_TIMESTAMP())声明与Oracle中的SYSDATE函数相同,动态返回Hive服务器的当前时间。
  3. 多种不同数据类型的CASE:在Hive0.13.0版本之前THEN或者ELSE后面的数据类型必须相同。否则可能会产生异常值,如ELSE后的数据类型必须同THEN。此问题在0.13.0之后得到修复。
  4. 解析和查找:LATERAL VIEW是用来生成用户自定义表以展开的形式显示map或array的值,如同EXPLODE(),但其会忽略值为NULL的列,如果要显示这些列,可以使用LATERAL VIEW OUTER(Hive0.12.0之后版本)
  5. 虚拟列:虚拟列是Hive中特殊的列的特殊函数类型。目前为止Hive仅支持2个虚拟列:INPUT_FILE_NAME和BLOCK_OFFSET_INSIDE_FILE。INPUT_FILE_NAME列是mapper的输入文件名,BLOCK_OFFSET_INSIDE_FILE是当前全部文件位置或当前压缩文件的块偏移量。
  6. wiki未提到的函数:
    例:isnull,用于检验值是否为空
    例:assert_true,如果条件为false时抛出异常
    例:elt,返回第n个字符串
    例:current_database,返回当前数据库名

四、 数据转换

在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];

0 0
原创粉丝点击