表由Timestamp字段分区

时间:2013-11-25 12:51:35

标签: hadoop hive

为了生成一些摘要数据,我们会定期向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

1 个答案:

答案 0 :(得分:10)

您好像在寻找动态分区,而Hive支持详细in this article的动态分区插入。

首先,您需要创建一个临时表,您可以在其中放置没有分区的平面数据。在你的情况下,这将是:

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之后支持,因此如果您使用旧版本,则可能无法使用。