spark是否足够聪明,可以在执行聚合时避免冗余值?

时间:2019-02-14 13:35:24

标签: apache-spark dataset aggregation

我有以下数据集

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 :(得分:2)

是,不是:

  • 是-collect_list执行地图端聚合,因此,如果每个分组键有多个值,则数据将在随机播放之前合并。
  • 否-因为空列表与丢失的数据不同。如果这不是您想要的行为,则应首先过滤数据

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

    但是请记住,如果deptId只有空数组,它将产生不同的结果。