我有以下情况,我使用 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
parquet.block.size = 128 MB
根据我的理解,Hadoop在读取操作期间将一个HDFS块映射到一个Parquet块大小,因此根据此示例,它应该映射到三个HDFS块。当我尝试使用 Spark 读取此 Parquet 文件时,我期待 3 个分区,但它导致了 1 个分区,我猜 Spark 正在根据 Parquet 文件大小(压缩大小(而不是基于文件中的块大小创建分区数。
问题是,为什么Spark NOT 根据 Parquet 文件中的块数/块大小对数据进行分区,而是按 Parquet 文件大小(压缩大小(进行分区?
Spark 中分区的大小由 spark.sql.files.maxPartitionBytes 决定。默认值为 128 MB。
达姆吉,朱尔斯S.,韦尼格,布鲁克,达斯,塔塔加塔,李,丹尼。学习火花(第264-265页(。奥赖利媒体。点燃版。
请注意,上述引用的推论是,Spark 数据帧的分区与从中创建数据帧的文件的布局无关。
由于读取后只有一个分区,因此看起来您为maxPartitionBytes
设置的值大于您正在读取的文件。