Hive 使用一个文件在配置单元中创建表

Hive 使用一个文件在配置单元中创建表,hive,create-table,hive-partitions,hiveddl,Hive,Create Table,Hive Partitions,Hiveddl,我正在使用以下命令在配置单元中创建新表: CREATE TABLE new_table AS select * from old_table; 我的问题是,创建表后,它会为每个分区生成多个文件,而我只希望每个分区有一个文件 我如何在表中定义它? 谢谢大家! 有许多可能的解决方案: 1) 在查询末尾添加按分区键分发。每个reducer可能有许多分区,每个reducer为每个分区创建文件。这也可以减少文件数量和内存消耗hive.exec.reducers.bytes.per.reducer设置将定

我正在使用以下命令在配置单元中创建新表:

CREATE TABLE new_table AS select * from old_table;
我的问题是,创建表后,它会为每个分区生成多个文件,而我只希望每个分区有一个文件

我如何在表中定义它?
谢谢大家!

有许多可能的解决方案:

1) 在查询末尾添加
按分区键分发
。每个reducer可能有许多分区,每个reducer为每个分区创建文件。这也可以减少文件数量和内存消耗
hive.exec.reducers.bytes.per.reducer
设置将定义每个reducer将处理的数据量

2) 简单,如果没有太多数据的话,非常好:添加
orderby
强制单个减速器。或者增加
hive.exec.reducers.bytes.per.reducer=500000000--500M文件。这是针对单减速器的解决方案,适用于数据不太多的情况,如果有大量数据,它将运行缓慢

<强>如果您的任务仅为map < /强>,则最好考虑选项3-5:

3) 如果在mapreduce上运行,打开“合并”:

set hive.merge.mapfiles=true;
set hive.merge.mapredfiles=true;
set hive.merge.size.per.task=500000000;  --Size of merged files at the end of the job
set hive.merge.smallfiles.avgsize=500000000; --When the average output file size of a job is less than this number, 
--Hive will start an additional map-reduce job to merge the output files into bigger files
4) 当在Tez上跑步时

set hive.merge.tezfiles=true; 
set hive.merge.size.per.task=500000000;
set hive.merge.smallfiles.avgsize=500000000;
5) 对于ORC文件可以使用以下命令高效地合并文件:
altertable T[PARTITION\u spec]连接-用于ORC