Hive 笔记

在Hive 中创建表时,默认情况下Hive 负责管理数据。这意味着Hive 把数据移入
它的"仓库目录" (warehouse directory) 。另一种选择是创建一个"外部表"
(external table)

加载数据到托管表时, Hive 把数据移到仓库目录。例如:
CREATE TABlE managed_table (dummy STRING);
lOAD DATA INPATH '/user/tom/data.txt' INTO table managed_table;
把文件hdfs://user/tom/data. txt 移动到Hive 的仓库目录中managed_table 表的目
录,即hdfs://user/h ive/warehouse/managed _table 。
如果随后要丢弃一个衰,可使用:
DROP TABlE managed_tablej
然后这个表(包括它的元数据和数据)会被一起删除。在此我们要重复强调,因为最
初的LOAD 是一个移动操作,而DROP 是一个删除操作,所以数据会彻底消失。这
就是Hive 所谓的"托管数据"的含义。
对于外部表而言,这两个操作的结果就不一样了:由你来控制数据的创建和删除。
外部数据的位置需要在创建表的时候指明:
CREATE EXTERNAL TABlE external_table (dummy STRING)
lOCATION '/user‘ /tom/external_table'j
lOAD DATA INPATH '/user、/tom/data.txt' INTO TABlE external_tablej
使用EXTERNAL 关键字以后, Hìve 知道数据并不由自己管理,因此不会把数据移
到自己的仓库目录。事实上,在定义时,它甚至不会检查这一外部位置是否存
在。这是一个非常重要的特性,因为这意味着你可以把创建数据推迟到创建表之后
才进行。

丢弃外部表时. Hive 不会碰数据,而只会删除元数据。

一个作业产生的桶(输出文件)和reduce 任务个数相同。

INSERT OVERWRITE TABLE
下面是INSERT 语句的一个示例:
INSERT OVERWRITE TABLE target
SELECT co11, co12
FROM source;
对于分区的表,可以使用PARTITION 子句来指明数据要插入哪个分区:
INSERT OVERWRITE TABLE target
PARTITION (dt='2818-81-81')
SELECT co11 , co12
FROM source;
OVERWRITE 关键字在这两种情况下都是强制的。这意味着目标表(对于前面的第一
个例子)或2010-01-01 分区(对于第二个例子)中的内容会被SELECT 语句的结果
替换掉

用户定义函数
UDF 操作作用于单个数据行,且产生一个数据行作为输出。大多数函数(例如
数学函数和字符串函数)都属于这一类。
• UDAF 接受多个输入数据行,井产生一个输出数据行。像COUNT 和MAX 这样
的函数都是聚集函数。
UDTF 操作作用于单个数据行,且产生多个数据行一-一个表一一作为输出。

猜你喜欢

转载自xuxu-dragon.iteye.com/blog/2249345