Количество Pyspark отличается в каждом столбце - PullRequest
0 голосов
/ 15 мая 2018

Я новенький Pyspark (и действительно Python). Я пытаюсь рассчитывать разные по каждому столбцу (не разные комбинации столбцов) Я хочу ответ на этот оператор SQL:

sqlStatement = "Select Count(Distinct C1) AS C1, Count(Distinct C2) AS C2, ..., Count(Distinct CN) AS CN From myTable"

distinct_count = spark.sql(sqlStatement).collect()

Это занимает вечность (16 часов) в кластере из 8 узлов (см. Конфигурацию ниже). Я пытаюсь оптимизировать набор данных 100 ГБ с 400 столбцами. Я не вижу способа использования SQL-примитивов dataframe, таких как:

df.agg(countDistinct('C1', 'C2', ..., 'CN'))

, поскольку это снова даст мне уникальные комбинации. Должен быть способ сделать это быстро.


Мастер-узел Стандарт (1 мастер, N рабочих) Тип машины
n1-highmem-8 (8 ВЦП, 52,0 ГБ памяти) Размер основного диска
500 ГБ Рабочие узлы
8 Тип машины
n1-highmem-4 (4 vCPU, 26,0 ГБ памяти) Размер основного диска
500 ГБ Локальные SSD
1

1 Ответ

0 голосов
/ 27 июня 2018

Обратите внимание, что вы используете метод .collect(), который возвращает все элементы набора данных драйверу, и это может привести к нехватке памяти у драйвера. См. эту ссылку для объяснения.

Вы можете увидеть, что передается, запустив .explain() по вашему запросу:

myquery = spark.sql(sqlStatement)
myquery.explain()

Вы можете облегчить проблему, разбив свой запрос на несколько запросов, чтобы не вычислять distinct() для каждого столбца одновременно. Это уменьшит количество данных, передаваемых за один раз.

...