为了生成一些摘要数据,我们定期将数据导入Hive.我们目前使用的是CSV文件格式,其布局如下:
operation,item,timestamp,user,marketingkey
Run Code Online (Sandbox Code Playgroud)
目前,我们有一些查询正在执行时间戳字段的日期(yyyy-mm-dd)分组.
正在导入的文件有时会保留更多天,我想以分区方式存储它.有没有办法用Hive做,我已经基于以下DDL构建表:
CREATE TABLE
partitionedTable (name string)
PARTITIONED BY (time bigint)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
Run Code Online (Sandbox Code Playgroud)
数据加载完成如下:
LOAD DATA LOCAL INPATH
'/home/spaeth/tmp/hadoop-billing-data/extracted/testData.csv'
INTO TABLE partitionedTable PARTITION(time='2013-05-01');
Run Code Online (Sandbox Code Playgroud)
但我希望该配置单元基于正在导入的文件中的字段以自动方式应用分区.例如:
login,1,1370793184,user1,none --> stored to partition 2013-06-09
login,2,1360793184,user1,none --> stored to partition 2013-02-13
login,1,1360571184,user2,none --> stored to partition 2013-02-11
buy,2,1360501184,user2,key1 --> stored to partition 2013-02-10
Run Code Online (Sandbox Code Playgroud)
Cha*_*guy 10
看起来您正在寻找动态分区,Hive支持动态分区插入,如本文所述.
首先,您需要创建一个临时表,您可以在其中放置没有分区的平面数据.在你的情况下,这将是:
CREATE TABLE
flatTable (type string, id int, ts bigint, user string, key string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
Run Code Online (Sandbox Code Playgroud)
然后,您应该将平面数据文件加载到此目录中:
LOAD DATA LOCAL INPATH
'/home/spaeth/tmp/hadoop-billing-data/extracted/testData.csv'
INTO TABLE flatTable;
Run Code Online (Sandbox Code Playgroud)
此时,您可以使用动态分区插入.要记住的一些事项是,您需要以下属性:
hive.exec.dynamic.partition
应该设置为true
因为默认情况下禁用动态分区我相信.hive.exec.dynamic.partition.mode
应设置为nonstrict
因为您有一个分区,严格模式强制您需要一个静态分区.因此,您可以运行以下查询:
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
FROM
flatTable
INSERT OVERWRITE TABLE
partitionedTable
PARTITION(time)
SELECT
user, from_unixtime(ts, 'yyyy-MM-dd') AS time
Run Code Online (Sandbox Code Playgroud)
这应该会产生2个MapReduce作业,最后你应该看到以下内容:
Loading data to table default.partitionedtable partition (time=null)
Loading partition {time=2013-02-10}
Loading partition {time=2013-02-11}
Loading partition {time=2013-02-13}
Loading partition {time=2013-06-09}
Run Code Online (Sandbox Code Playgroud)
并验证您的分区确实在这里:
$ hadoop fs -ls /user/hive/warehouse/partitionedTable/
Found 4 items
drwxr-xr-x - username supergroup 0 2013-11-25 18:35 /user/hive/warehouse/partitionedTable/time=2013-02-10
drwxr-xr-x - username supergroup 0 2013-11-25 18:35 /user/hive/warehouse/partitionedTable/time=2013-02-11
drwxr-xr-x - username supergroup 0 2013-11-25 18:35 /user/hive/warehouse/partitionedTable/time=2013-02-13
drwxr-xr-x - username supergroup 0 2013-11-25 18:35 /user/hive/warehouse/partitionedTable/time=2013-06-09
Run Code Online (Sandbox Code Playgroud)
请注意,动态分区仅在Hive 0.6之后受支持,因此如果您有旧版本,则可能无法运行.