【问题标题】:How to insert/copy one partition's data to multiple partitions in hive?如何将一个分区的数据插入/复制到配置单元中的多个分区?
【发布时间】:2019-05-10 05:32:09
【问题描述】:

我的 hive 表中有 day='2019-01-01' 的数据,我想将相同的数据复制到 2019 年 1 月的整个月份。 (即在'2019-01-02''2019-01-03'...'2019-01-31'

我正在尝试关注,但数据仅插入到“2019-01-02”中,而不是“2019-01-03”中。

INSERT OVERWRITE TABLE db_t.students PARTITION(dt='2019-01-02', dt='2019-01-03')
SELECT id, name, marks FROM db_t.students WHERE dt='2019-01-01';

【问题讨论】:

    标签: hive calendar hiveql date-range hive-partitions


    【解决方案1】:

    在所需日期范围内将所有数据与日历日期交叉连接。使用动态分区:

    set hivevar:start_date=2019-01-02; 
    set hivevar:end_date=2019-01-31; 
    
    set hive.exec.dynamic.partition=true; 
    set hive.exec.dynamic.partition.mode=nonstrict;  
    
    with date_range as 
    (--this query generates date range
    select date_add ('${hivevar:start_date}',s.i) as dt 
      from ( select posexplode(split(space(datediff('${hivevar:end_date}','${hivevar:start_date}')),' ')) as (i,x) ) s
    )
    
    INSERT OVERWRITE TABLE db_t.students PARTITION(dt)
    SELECT id, name, marks, r.dt --partition column is the last one
      FROM db_t.students s 
           CROSS JOIN date_range r
     WHERE s.dt='2019-01-01'
    DISTRIBUTE BY r.dt;
    

    另一种可能的解决方案是使用hadoop fs -cphadoop distcp 复制分区数据(对每个分区重复或在shell 中使用循环):

    hadoop fs -cp '/usr/warehouse/students/dt=2019-01-01' '/usr/warehouse/students/dt=2019-01-02'
    

    还有一种使用 UNION ALL 的解决方案:

        set hive.exec.dynamic.partition=true; 
        set hive.exec.dynamic.partition.mode=nonstrict;      
    
        INSERT OVERWRITE TABLE db_t.students PARTITION(dt)
        SELECT id, name, marks, '2019-01-02' as dt FROM db_t.students s WHERE s.dt='2019-01-01'
        UNION ALL
         SELECT id, name, marks, '2019-01-03' as dt FROM db_t.students s WHERE s.dt='2019-01-01'
        UNION ALL
         SELECT id, name, marks, '2019-01-04' as dt FROM db_t.students s WHERE s.dt='2019-01-01' 
        UNION ALL
        ... 
      ;
    

    【讨论】:

    • 采用不同方法的出色解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    相关资源
    最近更新 更多