apache-spark - 为什么 Spark 不根据读取时的 Parquet block 大小创建分区? (相反,它似乎按 Parquet 文件压缩大小进行分区)

标签 apache-spark hadoop apache-spark-sql parquet

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

Parquet 文件数量:1

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

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

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 block 映射到一个 Parquet block 大小,因此根据这个示例,它应该映射到三个 HDFS block 。当我尝试使用 Spark 读取这个 Parquet 文件时,我期望有 3 个分区,但结果是 1 个分区,我猜 Spark 是根据 Parquet 文件大小(压缩后的大小)而不是基于 block 大小创建分区数量文件。

问题是,为什么 Spark 不根据 Parquet 文件中的 block 数/ block 大小对数据进行分区,而是按 Parquet 文件大小(压缩大小)进行分区?

最佳答案

The size of a partition in Spark is dictated by spark.sql.files.maxPartitionBytes . The default is 128 MB.

Damji、Jules S.、Wenig、Brooke、Das、Tathagata、Lee、Denny。学习 Spark(第 264-265 页)。奥莱利媒体。 Kindle 版。

请注意,上述引述的一个推论是 Spark Dataframe 的分区独立于从中创建 Dataframe 的文件的布局。

由于读取后只有一个分区,因此您为 maxPartitionBytes 设置的值似乎大于您正在读取的文件。

关于apache-spark - 为什么 Spark 不根据读取时的 Parquet block 大小创建分区? (相反,它似乎按 Parquet 文件压缩大小进行分区),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61847278/

相关文章:

Hadoop 与 Web 应用程序的集成

apache-spark - 无法更改 spark-cassandra-connector 中的身份验证

apache-spark - Pyspark 窗口 orderBy

sql - 具有动态偏移量的 SQL 复制 LAG() 函数

scala - 如何在 Spark 中并行化 RDD/DataFrame 创建?

apache-spark - 为什么 Spark History Server 在本地集群模式下不显示已完成的应用程序?

json - 如何使用Apache Spark将JSON文件转换为 Parquet ?

hadoop - 使用 Spark 多次写入 hadoop 分布式文件系统

python - hadoop 2.4.0 使用 TAB 作为分隔符的流式通用解析器选项