2016-03-13 2 views
7

Я понимаю, что partitionBy функция разделяет мои данные. Если я использую rdd.partitionBy(100), он разделит мои данные ключом на 100 частей. то есть данные, связанные с аналогичными ключами, будут сгруппированы вместе.pyspark partioning data using partitionby

  1. Правильно ли я это понимаю?
  2. Желательно ли иметь количество разделов, равное числу доступных ядер? Это делает обработку более эффективной?
  3. Что делать, если мои данные не в ключевом формате. Могу ли я использовать эту функцию?
  4. позволяет сказать, что мои данные являются serial_number_of_student, student_name. В этом случае я могу разбить свои данные на имя_учреждения вместо serial_number?

ответ

9
  1. Не совсем. Spark, включая PySpark, is by default using hash partitioning. Исключая одинаковые ключи, нет практического сходства между ключами, назначенными одному разделу.
  2. Здесь нет простого ответа. Все зависит от количества данных и доступных ресурсов. Too large или слишком низкое количество разделов ухудшит производительность.

    Some resources утверждают, что количество разделов должно быть в два раза больше количества доступных ядер. С другой стороны, один раздел обычно не должен содержать более 128 МБ, а один блок тасования не может быть больше 2 ГБ (см. SPARK-6235).

    Наконец, вы должны скорректировать возможные перекос данных. Если некоторые ключи перепредставлены в вашем наборе данных, это может привести к субоптимальному использованию ресурсов и потенциальному сбою.

  3. Нет, или, по крайней мере, не напрямую. Вы можете использовать метод keyBy для преобразования RDD в требуемый формат. Более того, любой объект Python можно рассматривать как пару значений ключа , если он реализует необходимые методы, которые заставляют его вести себя как Iterable длины, равной двум. См. How to determine if object is a valid key-value pair in PySpark

  4. Это зависит от типа. Пока ключ hashable * тогда да. Обычно это означает, что она должна быть неизменной структурой, и все ее значения должны быть неизменными. Например, , но целых чисел tuple.

Процитируем Python glossary:

Объект является hashable, если он имеет значение хеш-функции, которые никогда не изменяется в течение его срока службы (ей необходим метод __hash__()), и их можно сравнить с другими объектами (ему нужен метод __eq__()). Объекты Hashable, которые сравнивают одинаковые, должны иметь одно и то же значение хэш-функции.

-1

Я недавно использовал разделby. Я сделал реструктуризацию своих данных, так что все те, которые я хочу разместить в одном разделе, имеют один и тот же ключ, который, в свою очередь, является значением данных. мои данные были списком словаря, который я преобразовал в tupples с ключом из словаря. В самом деле, разделby не сохранял одинаковые ключи в одном разделе. Но потом я понял, что ключи были струнами. Я бросил их в int.Но проблема продолжалась. Числа были очень большими. Затем я сопоставил эти числа с небольшими числовыми значениями, и это сработало. Так что я убираю то, что ключи должны быть маленькими целыми числами.

+0

Вы должны проверить этот ответ, он содержит много опечаток. –

 Смежные вопросы

  • Нет связанных вопросов^_^