我在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()
,我得到一个例外。我该怎么做呢?
由于
答案 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时间戳)。