Как перераспределение столбца в pyspark влияет на количество разделов? - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть датафрейм, имеющий миллион записей.Это выглядит так -

df.show()

+--------------------+--------------------++-------------
|            feature1|            feature2| domain    |
+--------------------+--------------------++-------------
|[2.23668528E8, 1....|[2.23668528E8, 1....| domain1   | 
|[2.23668528E8, 1....|[2.23668528E8, 1....| domain2   |
|[2.23668528E8, 1....|[2.23668528E8, 1....| domain1   |
|[2.23668528E8, 1....|[2.23668528E8, 1....| domain2   |
|[2.23668528E8, 1....|[2.23668528E8, 1....| domain1   |

Идеальный размер раздела - 128 МБ в искре, и давайте предположим, что столбец домена имеет два уникальных значения (домен1 и домен2). Учитывая это, у меня есть два вопроса -

  1. Если я сделаю df.repartition("domain") и если один раздел не сможет вместить все данные для конкретного ключа домена, произойдет ли сбой в приложении или оно автоматически создаст подходящие разделы в зависимости от данных?

  2. Предположим, что в приведенном выше перераспределении данных уже произошло на основе ключа домена, поэтому будет два раздела (уникальные ключи - domain1 и domain2).Теперь предположим, что domain1 и domain2 повторяются 1000000 раз, и я собираюсь сделать самостоятельное объединение на основе домена.Таким образом, для каждого домена я буду получать около 10 ^ 12 записей.Учитывая, что у нас есть два раздела, и количество соединений не изменяется во время объединений, смогут ли два новых раздела обрабатывать 1000000 записей?

1 Ответ

0 голосов
/ 12 декабря 2018

Ответ зависит от размера ваших данных.Когда один раздел не может содержать все данные, принадлежащие одному значению раздела (например, domain1), будет создано больше разделов, самое большее spark.sql.shuffle.partitions много.Если ваши данные слишком велики, т. Е. Один раздел превысит ограничение в 2 ГБ (см. Также Почему раздел Spark RDD имеет ограничение в 2 ГБ для HDFS? для объяснения этого), перераспределение приведет к OutOfMemoryError .
В качестве дополнительного примечания для предоставления полного ответа: возможность размещения данных в одном разделе не обязательно означает, что для значения раздела создается только один раздел.Это зависит - среди прочего - от количества исполнителей и от того, как данные были разделены ранее.Spark попытается избежать ненужной перестановки и, следовательно, может сгенерировать несколько разделов для одного значения раздела.

Таким образом, чтобы предотвратить сбой задания, вам следует настроить spark.sql.shuffle.partitions или передать необходимое количество разделов в repartition вместесо столбцом раздела.

...