关于Spark数据帧中分区数的清晰度

时间:2019-09-23 11:06:40

标签: apache-spark pyspark

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|
+----+-------+----+

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

如果我执行下一个操作:

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

结果将为2。