Bra*_*mat 4 hive create-table hive-partitions hiveddl
我正在使用以下命令在 Hive 中创建一个新表:
CREATE TABLE new_table AS select * from old_table;
Run Code Online (Sandbox Code Playgroud)
我的问题是在创建表后,它为每个分区生成多个文件 - 而我只需要每个分区一个文件。
我如何在表中定义它?谢谢!
有很多可能的解决方案:
1)distribute by partition key在查询的末尾添加。也许每个 reducer 有很多分区,每个 reducer 为每个分区创建文件。这也可以减少文件数量和内存消耗。hive.exec.reducers.bytes.per.reducer设置将定义每个减速器将处理多少数据。
2) 简单,数据不多的话还不错:加个order by强制单reducer。或者增加hive.exec.reducers.bytes.per.reducer=500000000;--500M文件。这是针对单个reducer的解决方案,数据量不大,数据量大的话,运行会很慢。
如果您的任务仅用于地图,则最好考虑选项 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
Run Code Online (Sandbox Code Playgroud)
4) 在 Tez 上运行时
set hive.merge.tezfiles=true;
set hive.merge.size.per.task=500000000;
set hive.merge.smallfiles.avgsize=500000000;
Run Code Online (Sandbox Code Playgroud)
5)对于 ORC 文件,您可以使用以下命令有效地合并文件:
ALTER TABLE T [PARTITION partition_spec] CONCATENATE;- 对于 ORC
| 归档时间: |
|
| 查看次数: |
3443 次 |
| 最近记录: |