我有以下使用 Spark 读取 Parquet 文件的场景:
Parquet 文件数量:1
文件中的 block 数(行组):3
每个 block (行组)的大小如下:
blockSize: 195 MB, rowCount: 1395661, compressedSize: 36107 bytes
blockSize: 295 MB, rowCount: 1538519, compressedSize: 38819 bytes
blockSize: 13 MB, rowCount: 52945, compressedSize: 1973 bytes
当我尝试使用 Spark 读取这个单个 Parquet 文件时,它只创建了一个分区。下面是代码:
val df = sqlContext.read.parquet(path)
println(df.rdd.getNumPartitions) // result is 1
parquet.block.size = 128 MB
根据我的理解,Hadoop 在读取操作期间将一个 HDFS block 映射到一个 Parquet block 大小,因此根据这个示例,它应该映射到三个 HDFS block 。当我尝试使用 Spark 读取这个 Parquet 文件时,我期望有 3 个分区,但结果是 1 个分区,我猜 Spark 是根据 Parquet 文件大小(压缩后的大小)而不是基于 block 大小创建分区数量文件。
问题是,为什么 Spark 不根据 Parquet 文件中的 block 数/ block 大小对数据进行分区,而是按 Parquet 文件大小(压缩大小)进行分区?
最佳答案
The size of a partition in Spark is dictated by spark.sql.files.maxPartitionBytes . The default is 128 MB.
Damji、Jules S.、Wenig、Brooke、Das、Tathagata、Lee、Denny。学习 Spark(第 264-265 页)。奥莱利媒体。 Kindle 版。
请注意,上述引述的一个推论是 Spark Dataframe 的分区独立于从中创建 Dataframe 的文件的布局。
由于读取后只有一个分区,因此您为 maxPartitionBytes
设置的值似乎大于您正在读取的文件。
关于apache-spark - 为什么 Spark 不根据读取时的 Parquet block 大小创建分区? (相反,它似乎按 Parquet 文件压缩大小进行分区),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61847278/