【问题标题】:Hive copy from partitioned table来自分区表的 Hive 副本
【发布时间】:2018-01-21 10:28:22
【问题描述】:

我有一个按 YEAR、MONTH 和 DATE 分区的原始表。例如:

col_1    col_2    col_3    YEAR    MONTH    DATE 
a        b        c        2017    03       25

我想创建一个新表,它是该表的子集,但仍保持原始表的分区。

简单到

CREATE new_table AS 
SELECT * 
FROM original_table 
WHERE (conditions);

但是,由于原始表太大,我必须通过分区迭代此查询。

我目前的解决方案是编写一个 shell 脚本,它遍历所有分区并为每个分区运行单独的查询。

例子:

for year in '2016' '2017'
    do
    for month in '01' '02' ...
        do
        for day in '01' '02' ...
            do
            hive -e "INSERT INTO new_table SELECT * FROM original_table WHERE YEAR=$year AND MONTH=$month etc."
        done
    done
done

但这似乎非常迂回和低效。有没有办法直接在蜂巢中作为一条线来做到这一点?

【问题讨论】:

  • 这些是外部表还是内部表?
  • 您没有插入任何分区...您是否尝试过WHERE year BETWEEN '2016' AND '2017',例如在查询中?

标签: hadoop hive hdfs partitioning


【解决方案1】:

我最近不得不在几天内做这样的事情,但它需要你复制原始表的架构,或者至少使用CREATE TABLE LIKE

但是,最重要的是,你的insert语句需要指定分区

CREATE TABLE new_table (
    fields... 
)
PARTITIONED BY (year STRING, month STRING, day  STRING);

INSERT OVERWRITE TABLE new_table PARTITION(year, month, day) 
SELECT fields... , year, month, day -- partitions must be last
FROM original_table
WHERE 
year BETWEEN '2016' AND '2017';  -- add more, as necessary

您也许还可以使用 CTAS 功能,但使用分区表执行这些功能并不简单

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 2015-09-13
    • 2019-10-27
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多