Оптимизировать отдельные значения на большом количестве столбцов - PullRequest
0 голосов
/ 22 мая 2018

У меня есть требование для вычисления различных значений для большого количества столбцов (> 20 000).Теперь я использую pyspark.sql.functions.approxCountDistinct (), чтобы получить приближение для каждого отдельного столбца.Это супер быстро (HyperLogLog).После этого, если отчетливый счетчик ниже некоторого порога (например, 10), мы хотим значения.У меня есть цикл, который делает это.

distinct_values_list[cname] = df.select(cname).distinct().collect()

Это очень медленно, так как большую часть времени, у меня есть много столбцов для обработки, может быть половина столбцов (10 КБ).Нет ли способа заставить спарк делать много колонок одновременно?Похоже, что он будет распараллеливать только каждый столбец, но не сможет сделать много столбцов одновременно.

Ценю любую помощь, которую я могу получить.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

(Обновлено) Не ​​уверен, что это достаточно быстро, но вы можете попробовать

import pyspark.sql.functions as F
df.select(*[
    F.collect_set(c).alias(c)
    for c in LIST_10k_COLS
]).collect()
0 голосов
/ 22 мая 2018

Предположим, у вас есть только 2 значения в каждом столбце.Тогда количество уникальных комбинаций будет 2 ^ 20000 = ~ 10 ^ 7000.Это 1 с 7000 нулей.Если в некоторых столбцах содержится более двух значений, это число будет еще выше.

  1. Пересмотрите свою модель.Все ли столбцы действительно независимы?Может ли быть так, что многие из этих столбцов просто представляют разные значения одного и того же измерения?Тогда, возможно, вы сможете существенно сократить количество столбцов.

  2. Подумайте, используете ли вы подходящий инструмент.Может быть, некоторые совершенно разные подходы (Neo4j, ...) подойдут лучше?

...