在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取代。 如果需要生成某个模块的配置缓存,