提问者:小点点

为什么Spark在读取时不根据Parquet块大小创建分区?(相反,它似乎通过Parquet文件压缩大小进行分区)


我有以下场景,我使用Spark读取Parquet文件:

镶木地板文件数:1

文件中的块数(行组):3

每个块(行组)的大小如下:

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

大小=128MB

根据我的理解,Hadoop在读取操作期间将一个HDFS块映射到一个Parquet块大小,因此根据这个示例,它应该映射到三个HDFS块。当我尝试使用Spark读取这个Parquet文件时,我期望有3个分区,但它导致了1个分区,我猜Spark是根据Parquet文件大小(压缩大小)创建分区数,而不是根据文件中的块大小。

问题是,为什么Spark不是基于Parquet文件中的块/块大小的数量来分区数据,而是通过Parquet文件大小(压缩大小)来分区?


共1个答案

匿名用户

Spark中分区的大小由park. sql.files.maxParttionBytes决定。默认值为128MB。

Damji,Jules S.,Venig,Brooke,Das,Tathagata,Lee,Denny。学习火花(第264-265页)。O'Reilly媒体。Kindle版。

请注意,上面引用的推论是Spark Dataframe的分区独立于创建Dataframe的文件的布局。

由于读取后只有一个分区,因此看起来您为maxParttionBytes设置了一个比您正在读取的文件大的值。