Hive - 分区列等于当前日期
Hive - Partition Column Equal to Current Date
我正在尝试从另一个没有今天日期列的 table 插入 Hive table。我要创建的分区是日期级别的。我想做的是这样的:
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"
如果我查询 table 并创建其中一个列,它就可以正常工作。知道如何在 HiveQL 中将分区日期设置为当前系统日期吗?
提前致谢,
克雷格
这里你想要的是 Hive dynamic partitioning。这允许在选择记录时动态确定将每个记录插入哪个分区的决定。在您的情况下,该决定基于您 运行 查询的日期。
要使用动态分区,您的分区子句有分区字段但没有值。映射到分区字段的值是 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;
不使用 unix_timestamp()
和 from_unixtime()
函数,current_date()
可以用来获取 'yyyy-MM-dd' 格式的当前日期。
current_date()
在 hive 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;
我希望你是 运行 一个 shell 脚本,然后你可以将当前日期存储在一个变量中。然后,您使用仅包含分区列的直线在 Hive 中创建一个空的 table。完成后,在将数据插入分区 table 时,您可以将该变量添加为分区列,然后数据将被插入。
我正在尝试从另一个没有今天日期列的 table 插入 Hive table。我要创建的分区是日期级别的。我想做的是这样的:
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"
如果我查询 table 并创建其中一个列,它就可以正常工作。知道如何在 HiveQL 中将分区日期设置为当前系统日期吗?
提前致谢,
克雷格
这里你想要的是 Hive dynamic partitioning。这允许在选择记录时动态确定将每个记录插入哪个分区的决定。在您的情况下,该决定基于您 运行 查询的日期。
要使用动态分区,您的分区子句有分区字段但没有值。映射到分区字段的值是 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;
不使用 unix_timestamp()
和 from_unixtime()
函数,current_date()
可以用来获取 'yyyy-MM-dd' 格式的当前日期。
current_date()
在 hive 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;
我希望你是 运行 一个 shell 脚本,然后你可以将当前日期存储在一个变量中。然后,您使用仅包含分区列的直线在 Hive 中创建一个空的 table。完成后,在将数据插入分区 table 时,您可以将该变量添加为分区列,然后数据将被插入。