通过unix时间戳进行动态分区

时间:2016-03-08 03:08:12

标签: mysql hadoop amazon-web-services hive partitioning

我在Hive中创建一个表,运行映射器转换然后保存表。我想根据运行Hive查询的时间对表进行分区。

我创建了表格:

CREATE EXTERNAL TABLE IF NOT EXISTS testtable (
    test_test STRING
) PARTITIONED BY (time STRING)
LOCATION 'loc/table'
;

然后在尝试此操作时运行转换并保存表:

FROM (
MAP 
one.test_test
USING 
'python job.py' 
AS test1
FROM 
one
) test_step
INSERT OVERWRITE TABLE testtable PARTITION (time=unix_timestamp())
SELECT CAST ( test_step.test1 AS STRING ) AS test_test
;

但是,当我这样做时

  

时间= UNIX_TIMESTAMP()

,我得到一个例外。我该怎么做呢?

由于

1 个答案:

答案 0 :(得分:2)

我认为如果你使用动态分区(https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-DynamicPartitionInserts)它应该可行。分区字段只是表中的另一列,因此如果查询中有列的值,则Hive会自动将其放在正确的分区中。所以你的陈述看起来像这样

FROM (
MAP 
one.test_test
USING 
'python job.py' 
AS test1
FROM 
one
) test_step
INSERT OVERWRITE TABLE testtable PARTITION (time)
SELECT CAST ( test_step.test1 AS STRING ) AS test_test,
unix_timestamp() as time
;

这样做可能会创建大量分区,因为unix_timestamp()的值在执行查询期间会发生变化。最好先使用额外的语句来创建分区然后插入。

编辑:要预先添加分区,您需要以某种方式设置所需的时间戳,例如脚本的参数。然后

ALTER TABLE testtable ADD PARTITION (time=your_timestamp_here);

这将在你的原始查询之前,你将unix_timestamp()替换为your_timestamp_here(当然这将是一个有效的unix时间戳)。