如何在使用 Spark 读取时将数据分配到 X 个分区?
How to distribute data into X partitions on read with Spark?
我正在尝试使用 Spark DF 从 Hive 读取数据并将其分配到特定数量的可配置分区(与内核数量相关)。我的工作非常简单,不包含任何连接或聚合。我读过 spark.sql.shuffle.partitions
属性 但文档说:
Configures the number of partitions to use when shuffling data for joins or aggregations.
这是否意味着我配置此 属性 无关紧要?或者读取操作是否被视为随机播放?如果没有,还有什么选择?重新分区和合并似乎有点矫枉过正。
为了验证我对您的问题的理解,您想增加读取数据后立即创建的 rdd/dataframe 中的分区数。
在这种情况下,您所追求的 属性 是 spark.sql.files.maxPartitionBytes
,它控制着可以在最大分区中推送的最大数据(请参考 https://spark.apache.org/docs/2.4.0/sql-performance-tuning.html)
默认值为 128 MB,可以将其覆盖以提高并行性。
读取本身并不是随机播放。您需要在某个阶段获取数据。
可以使用下面的答案,或者 Spark 的算法设置读取时的分区数。
您没有说明您使用的是 RDD 还是 DF。使用 RDD,您可以设置 num 个分区。使用 DF 需要在一般读取后重新分区。
如您所述,在加入或聚合时,您关于控制并行性的观点不太相关。
我正在尝试使用 Spark DF 从 Hive 读取数据并将其分配到特定数量的可配置分区(与内核数量相关)。我的工作非常简单,不包含任何连接或聚合。我读过 spark.sql.shuffle.partitions
属性 但文档说:
Configures the number of partitions to use when shuffling data for joins or aggregations.
这是否意味着我配置此 属性 无关紧要?或者读取操作是否被视为随机播放?如果没有,还有什么选择?重新分区和合并似乎有点矫枉过正。
为了验证我对您的问题的理解,您想增加读取数据后立即创建的 rdd/dataframe 中的分区数。
在这种情况下,您所追求的 属性 是 spark.sql.files.maxPartitionBytes
,它控制着可以在最大分区中推送的最大数据(请参考 https://spark.apache.org/docs/2.4.0/sql-performance-tuning.html)
默认值为 128 MB,可以将其覆盖以提高并行性。
读取本身并不是随机播放。您需要在某个阶段获取数据。
可以使用下面的答案,或者 Spark 的算法设置读取时的分区数。
您没有说明您使用的是 RDD 还是 DF。使用 RDD,您可以设置 num 个分区。使用 DF 需要在一般读取后重新分区。
如您所述,在加入或聚合时,您关于控制并行性的观点不太相关。