如何在Hive中限制Parquet表的Parquet文件尺寸?

3

我正在尝试在Hive中创建一个Parquet表。 我可以创建它,但是当我运行“analyze table mytable compute statistics;”时,我得到了以下结果:

numfiles=800, numrows=10000000, totalSize=18909876 rawDataSize=40000000

为什么这个表只有180 Mb,却由800个文件组成? 有没有办法设置文件的数量? 我尝试使用“SET parquet.block.size=134217728”,但结果仍然相同。


问题:创建表的作业中有多少个Mappers / Reducers?如果您有800个Mappers和没有Reducer,并且属性'hive.merge.**files'不是 True *,那么您将拥有800个物理文件。故事结束。 - Samson Scharfrichter
问题:您是否检查了表中不同的INPUT__FILE__NAME数量?以及表所使用的文件夹中HDFS文件的数量(由于空数据文件可能会更高)? - Samson Scharfrichter
你是如何加载这个表的? - rbyndoor
@ruby @ Samson Scharfrichter 我正在使用带有Spark的JavaHiveContext,在其中放置了我的hiveql查询。我使用“create table myTable(.....)stored as parquetfile”创建表,然后创建一些对象并将其放入RDD中。我将此RDD保存为临时表,然后调用INSERT INTO。 - Fabio
@SamsonScharfrichter 我有800个不同的INPUT__FILE__NAME。我该如何检查表所使用的文件夹中HDFS文件的数量? - Fabio
这是由于Spark输出是分布式的,可能需要在保存到临时文件之前进行收集。 - rbyndoor
2个回答

2

Reducers数量决定了Parquet文件的数量。

请检查mapred.reduce.tasks参数。

例如,您可能有一个仅生成100行的MapReduce作业,但如果mapred.reduce.tasks被设置为800(明确或隐含),则会输出800个Parquet文件(大多数Parquet文件将只有标题而没有实际数据)。


真的。之前我使用每个执行器有8个核心的6个执行器提交我的Spark应用程序,它产生了800个作业。现在我尝试只在驱动程序上使用一个核心,我只得到了10个文件(和10个作业)。这很好,但是如何使用所有资源仅获取10个文件? - Fabio
每个reducer都必须生成自己的输出(parquet)文件,以便可以将其选为正确答案。您仍然可以拥有所需数量的mappers,并根据需要调整reducers的数量,以在创建parquet文件的时间和读取它的时间之间找到良好的平衡,具体取决于您的情况哪个更重要。 - Tagar

0

在编写Hive插入语句时,您还需要设置dfs.blocksize=134217728和SET parquet.block.size=134217728。两个块大小都应该设置。


我尝试了,但结果还是一样的。 - Fabio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接