Подсчет нескольких счетчиков в одном выражении - PullRequest
0 голосов
/ 14 мая 2018

У меня есть следующий код, написанный на Spark с использованием Scala и SQL API:

sourceData
  .groupBy($"number")
  .agg(                        
       countDistinct(when(...something...)),
       countDistinct(when(...something...)),
       countDistinct(when(...something...)),
       countDistinct(when(...something...))),
       countDistinct(when(...something...)))

Когда я проверяю план выполнения, Spark внутренне выполняет что-то под названием «расширение» и умножает записи 5 раз (для каждого счетаотдельный столбец).Поскольку у меня уже есть миллиарды записей, это становится очень неэффективным.Есть ли способ сделать это более эффективным способом, и, пожалуйста, не говорите countApproxDistinct, поскольку мне нужны точные значения:)

1 Ответ

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

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

sourceData
  .withColumn("engineered_col1", expr("CASE WHEN ... THEN 1 ELSE 0 END")
  .withColumn("engineered_col2", expr("CASE WHEN ... THEN 1 ELSE 0 END")
  .groupBy($"number")
  .agg(max($"engineered_col1"),max($"engineered_col2"))
...