Является ли искра достаточно умной, чтобы избежать избыточных значений при выполнении агрегации? - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть следующий набор данных

case class Department(deptId:String,locations:Seq[String])

// using spark 2.0.2
// I have a Dataset `ds` of type Department   

+-------+--------------------+
|deptId |      locations     |
+-------+--------------------+
|     d1|[delhi,kerala]      |            
|     d1|[]                  |
|    dp2|[]                  |
|    dp2|[hyderabad]         |       
+-------+--------------------+

Я намеревался преобразовать его в

// Dataset `result` of type Department itself

+-------+--------------------+
|deptId |      locations     |
+-------+--------------------+
|     d1|[delhi,kerala]      |            
|    dp2|[hyderabad]         |   
+-------+--------------------+

Я делаю следующее

val flatten = udf(
  (xs: Seq[Seq[String]]) => xs.flatten)

val result = ds.groupBy("deptId").
                agg(flatten(collect_list("locations")).as("locations")

Мой вопрос:Spark достаточно умен, чтобы не шататься вокруг пустых locations то есть []?

PS: Я не уверен, что это глупый вопрос.

1 Ответ

0 голосов
/ 14 февраля 2019

Да и нет:

  • Да - collect_list выполняет агрегацию на стороне карты, поэтому при наличии нескольких значений на ключ группировки данные будут объединены до случайного перемешивания.
  • Нет - потому что пустой список не совпадает с отсутствующими данными.Если это нежелательное поведение, вам следует сначала отфильтровать данные

    ds.filter(size($"location") > 0).groupBy("deptId").agg(...)
    

    , но имейте в виду, что он даст другой результат, если для deptId.

...