【问题标题】:Partition Hive table by existing field?按现有字段分区 Hive 表?
【发布时间】:2015-12-09 03:12:31
【问题描述】:

我可以在插入现有字段时对 Hive 表进行分区吗?

我有一个 10 GB 的文件,其中包含日期字段和一天中的小时字段。我可以将此文件加载到表中,然后插入覆盖到另一个使用这些字段作为分区的分区表中吗?会像下面这样工作吗?

INSERT OVERWRITE TABLE tealeaf_event  PARTITION(dt=evt.datestring,hour=evt.hour) 
SELECT * FROM staging_event evt;

谢谢!

特拉维斯

【问题讨论】:

    标签: hadoop hive partitioning hdfs database-partitioning


    【解决方案1】:

    我刚刚遇到了这个问题,试图回答同样的问题,它很有帮助,但还不够完整。简短的回答是肯定的,类似问题中的查询会起作用,但语法不太正确。

    假设您有三个使用以下语句创建的表:

    CREATE TABLE staging_unpartitioned (datestring string, hour int, a int, b int);
    
    CREATE TABLE staging_partitioned (a int, b int) 
        PARTITIONED BY (datestring string, hour int);
    
    CREATE TABLE production_partitioned (a int, b int) 
        PARTITIONED BY (dt string, hour int);
    

    ab 只是一些示例列。 dthour 是我们想要在它到达生产表后对其进行分区的值。将暂存数据从 staging_unpartitionedstaging_partitioned 移至生产环境看起来完全一样。

    INSERT OVERWRITE TABLE production_partitioned PARTITION (dt, hour)
        SELECT a, b, datestring, hour FROM staging_unpartitioned;
    
    INSERT OVERWRITE TABLE production_partitioned PARTITION (dt, hour)
        SELECT a, b, datestring, hour FROM staging_partitioned;
    

    这使用了一个称为动态分区的过程,您可以阅读有关here 的信息。需要注意的重要一点是,哪些列与哪些分区相关联是由 SELECT 顺序决定的。所有动态分区都必须按顺序最后选择。

    当您尝试运行上面的代码时,很有可能会因为您设置的属性而遇到错误。首先,如果您禁用了动态分区,它将无法工作,因此请确保:

    set hive.exec.dynamic.partition=true;
    

    如果您没有在动态分区之前至少在一个静态分区上进行分区,那么您可能会遇到错误。当您打算用动态分区覆盖其子分区时,此限制将避免您意外删除根分区。以我的经验,这种行为从来没有帮助过,而且经常很烦人,但你的里程可能会有所不同。无论如何,它很容易改变:

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

    应该这样做。

    【讨论】:

      【解决方案2】:

      也许这已经被回答了......但是是的,你可以完全按照你所说的去做。我已经做过很多次了。显然,您的新表需要与原始表类似地定义,但没有分区列,并且具有分区规范。另外,我不记得是否必须明确列出原始表中的列,或者星号是否足够。

      【讨论】:

        【解决方案3】:

        我对此不太确定,但这样的事情可能会奏效

        INSERT OVERWRITE TABLE tealeaf_event
        SELECT col1 as tealeaf_col1, ..., datestring as ds;
        

        【讨论】:

          【解决方案4】:

          没有。您必须删除该字段,或者至少重命名它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-05-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多