【问题标题】:Hive - Partition Column Equal to Current DateHive - 分区列等于当前日期
【发布时间】:2015-04-29 10:14:24
【问题描述】:

我正在尝试从另一个没有今天日期列的表中插入 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 中将分区日期设置为当前系统日期吗?

提前致谢,

克雷格

【问题讨论】:

    标签: hive hiveql


    【解决方案1】:

    你想要的是 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;
    

    【讨论】:

    • 我做了这样的事情并让它工作。谢谢杰里米!
    【解决方案2】:

    除了使用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;
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2017-08-28
        • 2015-10-07
        • 2016-07-08
        • 2016-08-12
        • 1970-01-01
        • 2021-01-27
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多