Ясность по количеству разделов в искровом фрейме - PullRequest
0 голосов
/ 23 сентября 2019
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

Как происходит создание 44 разделов для фрейма данных с 3 дисками?

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 ]

1 голос
/ 23 сентября 2019

Когда набор данных / Dataframe создается из коллекции, он учитывает номер строки.В конечном итоге это сводится к LocalTableScanExec, посмотрите здесь

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

Где unsafeRows.length соответствует предоставленному размеру коллекции.

Также посмотрите на этот ответ для нескольких связанных настроек.

0 голосов
/ 23 сентября 2019

Причина. Spark изначально создала N разделов независимо от данных.Например, я запустил Spark локально с «local [4]» и создал DF из 2 строк df.rdd().getNumPartitions() вернул бы 4, потому что для задания Spark есть 4 ядра.

Если я сделаю следующее:

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

результат будет 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...