在下面的场景中,我使用spark读取Parquet文件:
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
parquet.block.size=128 mb
根据我的理解,hadoop在读取操作期间将一个hdfs块Map到一个Parquet块大小,因此根据这个示例,它应该Map到三个hdfs块。当我尝试使用spark读取这个Parquet文件时,我期望有3个分区,但结果是1个分区,我猜spark是基于Parquet文件大小(即压缩大小)而不是基于文件中的块大小创建分区数。
问题是,为什么spark不根据Parquet文件中的块数/块大小来划分数据,而是按Parquet文件大小(压缩大小)来划分?
1条答案
按热度按时间qpgpyjmq1#
spark中分区的大小由spark.sql.files.maxpartitionbytes指定。默认值为128 mb。
丹吉,朱尔斯s.,韦尼格,布鲁克,达斯,如来,李,丹尼。学习Spark(第264-265页)。奥莱利媒体。kindle版。
注意,上面引用的推论是sparkDataframe的分区独立于创建Dataframe的文件的布局。
因为读取后只有一个分区,所以看起来您为它设置了一个值
maxPartitionBytes
比您正在读取的文件大。