为什么 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

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设置的值大于您正在读取的文件。

相关内容

  • 没有找到相关文章

最新更新