Scala 在Spark聚合期间收集唯一元素 问题
我需要在我的代码中更新这一行。我该怎么做Scala 在Spark聚合期间收集唯一元素 问题,scala,apache-spark,append,Scala,Apache Spark,Append,我需要在我的代码中更新这一行。我该怎么做 "case StringType => concat_ws(",",collect_list(col(c)))" 仅附加现有字段中不存在的字符串。在本例中,字母“b”不会出现两次 代码 您可能希望使用collect\u set()而不是collect\u list()。这将在收集过程中自动删除重复项 我不知道为什么要将唯一字符串数组转换为逗号分隔的列表。Spark可以很容易地处理数组列,并且它们的显示方式使每个元素都可以看到。不过,如果您必须将
"case StringType => concat_ws(",",collect_list(col(c)))"
仅附加现有字段中不存在的字符串。在本例中,字母“b”不会出现两次
代码
您可能希望使用
collect\u set()
而不是collect\u list()
。这将在收集过程中自动删除重复项
我不知道为什么要将唯一字符串数组转换为逗号分隔的列表。Spark可以很容易地处理数组列,并且它们的显示方式使每个元素都可以看到。不过,如果您必须将数组转换为逗号分隔的字符串,请在Spark 2.4+或Spark早期版本的UDF中使用。我如何向代码“df.groupBy(“id”).agg(aggExprs.head,aggExprs.tail:908;”中添加一列,该列只给出作为组的元组的计数。(例如“按id,d从tbl组中选择id,d,COUNT()。非常感谢。
val df =Seq(
(1, 1.0, true, "a"),
(2, 2.0, false, "b")
(3, 2.0, false, "b")
(3, 2.0, false, "c")
).toDF("id","d","b","s")
val dataTypes: Map[String, DataType] = df.schema.map(sf =>
(sf.name,sf.dataType)).toMap
def genericAgg(c:String) = {
dataTypes(c) match {
case DoubleType => sum(col(c))
case StringType => concat_ws(",",collect_list(col(c)))
case BooleanType => max(col(c))
}
}
val aggExprs: Seq[Column] = df.columns.filterNot(_=="id")
.map(c => genericAgg(c))
df
.groupBy("id")
.agg(
aggExprs.head,aggExprs.tail:_*
)
.show()