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|
+----+-------+----+
答案 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。