【问题标题】:Clarity on number of partitions in spark dataframe明确火花数据框中的分区数
【发布时间】:2020-01-23 10:37:45
【问题描述】:
from pyspark.sql.types import *

schema = StructType([StructField("type", StringType(), True), StructField("average", IntegerType(), True)])
values = [('A', 19), ('B', 17), ('C', 10)]
df = spark.createDataFrame(values, schema)

parts = df.rdd.getNumPartitions()

print(parts)

输出为 44

spark 如何为 3 个记录数据帧创建 44 个分区?

import pyspark.sql.functions as F
df.withColumn('p_id', F.spark_partition_id()).show()

输出:

+----+-------+----+
|type|average|p_id|
+----+-------+----+
|   A|     19|  14|
|   B|     17|  29|
|   C|     10|  43|
+----+-------+----+

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案1】:

    当从集合中创建数据集/数据框时,它确实会考虑行数。 最终归结为LocalTableScanExec,看here

    numParallelism: Int = math.min(math.max(unsafeRows.length, 1),  sqlContext.sparkContext.defaultParallelism)
    rdd = sqlContext.sparkContext.parallelize(unsafeRows, numParallelism)
    

    其中unsafeRows.length 等于提供的集合大小。

    另外,请查看this 答案以了解几个相关设置。

    【讨论】:

      【解决方案2】:

      因为 Spark 最初会创建 N 个分区,而不考虑数据。例如,我使用“local[4]”在本地运行 Spark,并从 2 行创建了一个 DF df.rdd().getNumPartitions() 将返回 4,因为 Spark 作业有 4 个内核。

      如果我做下一步:

      df.repartition(2).rdd().getNumPartitions()
      

      结果为 2。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-30
        • 1970-01-01
        相关资源
        最近更新 更多