我有以下场景,我使用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文件大小(压缩大小)来分区?
Spark中分区的大小由park. sql.files.maxParttionBytes决定。默认值为128MB。
Damji,Jules S.,Venig,Brooke,Das,Tathagata,Lee,Denny。学习火花(第264-265页)。O'Reilly媒体。Kindle版。
请注意,上面引用的推论是Spark Dataframe的分区独立于创建Dataframe的文件的布局。
由于读取后只有一个分区,因此看起来您为maxParttionBytes
设置了一个比您正在读取的文件大的值。