lha*_*y86 2 hadoop hive partitioning hdfs
我有一个按年、月和日期分区的原始表。例如:
col_1 col_2 col_3 YEAR MONTH DATE
a b c 2017 03 25
Run Code Online (Sandbox Code Playgroud)
我想创建一个新表,它是该表的子集,但仍保留原始表的分区。
就像简单的事情
CREATE new_table AS
SELECT *
FROM original_table
WHERE (conditions);
Run Code Online (Sandbox Code Playgroud)
但是,由于原始表太大,我必须通过分区迭代此查询。
我当前的解决方案是编写一个 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
Run Code Online (Sandbox Code Playgroud)
但这显得非常迂回且低效。有没有办法直接在配置单元中将其作为一行来执行此操作?
我最近不得不在几天内做这样的事情,但它要求您复制原始表的架构,或者至少使用CREATE TABLE LIKE
但是,最重要的是,您的插入语句需要指定分区
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
Run Code Online (Sandbox Code Playgroud)
您也许还可以使用 CTAS 函数,但使用分区表执行这些操作并不简单
| 归档时间: |
|
| 查看次数: |
12593 次 |
| 最近记录: |