hive按unix时间戳动态分区

ffscu2ro  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(338)

我在配置单元中创建一个表,运行Map器转换,然后保存一个表。我想根据运行配置单元查询时对表进行分区。
我创建表:

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\u时间戳()
,我得到一个例外。我该怎么做呢?
谢谢

xmakbtuz

xmakbtuz1#

我认为如果你使用动态分区的话应该可以(https://cwiki.apache.org/confluence/display/hive/languagemanual+dml#languagemanualdml-动态分区(插入)。partition字段只是表中的另一列,因此如果查询中有该列的值,那么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\u timestamp()的值在查询执行期间会发生变化。最好先使用一个额外的语句来创建分区,然后再插入。
编辑:要预先添加分区,您需要以某种方式设置所需的时间戳,例如脚本的参数。然后

ALTER TABLE testtable ADD PARTITION (time=your_timestamp_here);

这将在原始查询之前进行,在原始查询中将unix\u timestamp()替换为这里的\u timestamp\u(当然这是一个有效的unix时间戳)。

相关问题