spark 是否足够聪明,可以在执行聚合时避免冗余值?
Is spark smart enough to avoid redundant values while performing 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: 我不确定这是不是一个愚蠢的问题。
是与否:
- 是 -
collect_list
执行映射端聚合,因此如果每个分组键有多个值,数据将在随机播放之前合并。
否 - 因为空列表与缺失数据不同。如果这不是您想要的行为,您应该先过滤数据
ds.filter(size($"location") > 0).groupBy("deptId").agg(...)
但请记住,如果 deptId
.
只有空数组,它会产生不同的结果
我有以下数据集
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: 我不确定这是不是一个愚蠢的问题。
是与否:
- 是 -
collect_list
执行映射端聚合,因此如果每个分组键有多个值,数据将在随机播放之前合并。 否 - 因为空列表与缺失数据不同。如果这不是您想要的行为,您应该先过滤数据
ds.filter(size($"location") > 0).groupBy("deptId").agg(...)
但请记住,如果
deptId
. 只有空数组,它会产生不同的结果