[英]Table Partitioned by Timestamp Field
为了生成一些摘要数据,我们定期将数据导入Hive。 我们目前使用的是CSV文件格式,其布局如下:
operation,item,timestamp,user,marketingkey
目前,我们有一些查询正在执行时间戳字段的日期(yyyy-mm-dd)分组。
正在导入的文件有时会保留更多天,我想以分区方式存储它。 有没有办法用Hive做,我已经基于以下DDL构建表:
CREATE TABLE
partitionedTable (name string)
PARTITIONED BY (time bigint)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
数据加载完成如下:
LOAD DATA LOCAL INPATH
'/home/spaeth/tmp/hadoop-billing-data/extracted/testData.csv'
INTO TABLE partitionedTable PARTITION(time='2013-05-01');
但我希望该配置单元基于正在导入的文件中的字段以自动方式应用分区。 例如:
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
看起来您正在寻找动态分区,Hive支持动态分区插入,如本文所述 。
首先,您需要创建一个临时表,您可以在其中放置没有分区的平面数据。 在你的情况下,这将是:
CREATE TABLE
flatTable (type string, id int, ts bigint, user string, key string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
然后,您应该将平面数据文件加载到此目录中:
LOAD DATA LOCAL INPATH
'/home/spaeth/tmp/hadoop-billing-data/extracted/testData.csv'
INTO TABLE flatTable;
此时,您可以使用动态分区插入。 要记住的一些事项是,您需要以下属性:
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
这应该会产生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}
并验证您的分区确实在这里:
$ 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
请注意,动态分区仅在Hive 0.6之后受支持,因此如果您有旧版本,则可能无法运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.