当前位置: 首页 > 知识库问答 >
问题:

指定从配置单元插入生成的最小文件数

翟元凯
2023-03-14

共有1个答案

邓子濯
2023-03-14

Insert...Select期间生成的文件数取决于在最终还原器(如果在Tez上运行,则为最终还原器顶点)上运行的进程数以及每个配置的还原器的字节数。

如果表是分区的,并且没有指定distributeBy,那么在最坏的情况下,每个还原器在每个分区中创建文件。这会在减速器上产生高压,并可能导致OOM异常。

要确保每个还原器只写入一个分区文件,请在查询末尾添加distribute BY partition_column

INSERT OVERWRITE table PARTITION(part_col)
SELECT * 
  FROM src
DISTRIBUTE BY  part_col, FLOOR(RAND()*100.0)%10; --10 files per partition
set hive.exec.reducers.bytes.per.reducer=67108864; 

如果您有太多的数据,Hive将启动更多的reducer来处理每个reducer进程上指定的不超过字节的每个reducer。还原器越多--生成的文件就越多。减少此设置可能会增加正在运行的还原器的数量,并且每个还原器至少会创建一个文件。如果分区列不在distributeBy中,则每个还原器可以在每个分区中创建文件。

长话短说,使用

DISTRIBUTE BY  part_col, FLOOR(RAND()*100.0)%10 -- 10 files per partition

如果您希望每个分区有20个文件,请使用FLOOR(兰德()*100.0)%20;-如果您有足够的数据,这将保证每个分区至少20个文件,但不能保证每个文件的最大大小。

 类似资料:
  • 我试图做一些性能优化的数据存储。这个想法是使用蜂巢的巴克特/集群来桶可用的设备(基于列id)。我目前的方法是从外部表插入数据到表中的拼花文件。结果它应用了巴克特。 我想通过直接从PySpark 2.1将数据摄取到该表中来摆脱中间的这一步。使用SparkSQL执行相同的语句会导致不同的结果。添加cluster by子句 仍然会导致不同的输出文件。 这就引出了两个问题:1)从spark向集群蜂箱表中插

  • File3可以是 如何将配置单元表修改为我将与文件一起接收的列。

  • 嗨,我是Hive的新手,我想把当前的时间戳和一行数据一起插入到我的表中。 我得到的错误是: 如果有人能帮忙,那就太好了,非常感谢frostie

  • 生成配置缓存optimize:config 可以为应用或者模块生成配置缓存文件 php think optimize:config 默认生成应用的配置缓存文件,调用后会在runtime目录下面生成init.php文件,生成配置缓存文件后,应用目录下面的config.php common.php以及tags.php不会被加载,被runtime/init.php取代。 如果需要生成某个模块的配置缓存,