Hive - 分区列等于当前日期

时间:2015-02-26 20:55:10

标签: hive hiveql

我正在尝试从另一个没有今天日期列的表中插入Hive表。我想要创建的分区是在日期级别。我想做的是这样的事情:

INSERT OVERWRITE TABLE table_2_partition 
PARTITION (p_date = from_unixtime(unix_timestamp() - (86400*2) ,  'yyyy-MM-dd'))
SELECT * FROM table_1;

但是当我运行这个时,我收到以下错误:

"cannot recognize input near 'from_unixtime' '(' 'unix_timestamp' in constant"

如果我查询一个表并使其中一个列工作正常。知道如何在HiveQL中将分区日期设置为当前系统日期吗?

提前致谢,

克雷格

3 个答案:

答案 0 :(得分:3)

你想要的是Hive dynamic partitioning。这允许在选择记录时动态确定插入每个记录的分区的决定。在您的情况下,该决定基于您运行查询的日期。

要使用动态分区,您的partition子句具有分区字段,但不具有值。映射到分区字段的值是SELECT末尾的值,并且顺序相同。

对所有分区字段使用动态分区时,需要确保使用nonstrict作为动态分区模式(hive.exec.dynamic.partition.mode)。

在您的情况下,您的查询看起来像:

SET hive.exec.dynamic.partition.mode=nonstrict;

INSERT OVERWRITE TABLE table_2_partition 
PARTITION (p_date)
SELECT
    *
  , from_unixtime(unix_timestamp() - (86400*2) ,  'yyyy-MM-dd')
FROM table_1;

答案 1 :(得分:0)

unix_timestamp()可以使用'yyyy-MM-dd'格式获取当前日期,而不是使用from_unixtime()current_date()函数。

current_date()已在配置单元1.2.0中添加。 official documentation

修改后的查询为:

SET hive.exec.dynamic.partition.mode=nonstrict;

INSERT OVERWRITE TABLE table_2_partition 
PARTITION (p_date)
SELECT
    *
  , current_date()
FROM table_1;

答案 2 :(得分:0)

我希望您正在运行Shell脚本,然后可以将当前日期存储在变量中。然后,您使用仅带有分区列的beeline在Hive中创建一个空表。完成后,在将数据插入分区表时,您可以将该变量添加为分区列,然后将插入数据。