Apache spark 聚合spark数据帧并基于数组类型列中是否存在值进行计数

Apache spark 聚合spark数据帧并基于数组类型列中是否存在值进行计数,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个带有数组类型列的spark数据帧: scala> mydf.printSchema root |-- arraycol: array (nullable = true) | |-- element: string (containsNull = true) |-- id: integer (nullable = false) 我现在需要通过“id”聚合此数据帧,并根据数组中是否存在特定值进行计数。我试着这么做: val aggdata = mydf.groupBy("

我有一个带有数组类型列的spark数据帧:

scala> mydf.printSchema
root
 |-- arraycol: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- id: integer (nullable = false)
我现在需要通过“id”聚合此数据帧,并根据数组中是否存在特定值进行计数。我试着这么做:

val aggdata = mydf.groupBy("id").
  agg(
    count(when($"arraycol" contains "someval", $"arraycol")).as("aggval"))

这似乎不起作用。任何输入我如何能做到这一点?

数组\u包含的
方法来测试条件:

val df=Seq((1,Seq(“a”,“b”),(1,Seq(“b”),(2,Seq(“b”))。toDF(“id”,“arrayCol”)
//df:org.apache.spark.sql.DataFrame=[id:int,arrayCol:array]
df.show
+---+--------+
|id | arrayCol|
+---+--------+
|1 |[a,b]|
|1 |[b]|
|2 |[b]|
+---+--------+
df.groupBy(“id”).agg(
计数(当(数组_包含($“arrayCol”,“a”),$“arrayCol”)时)。作为(“hasA”)
).表演
+---+----+
|哈萨|
+---+----+
|  1|   1|
|  2|   0|
+---+----+
或使用
求和

df.groupBy(“id”).agg(
总和(当(数组_包含($“arrayCol”,“a”),1时)。否则(0))。作为(“hasA”)
).表演
+---+----+
|哈萨|
+---+----+
|  1|   1|
|  2|   0|
+---+----+

请提供样本输入和预期输出,以便您回复!不幸的是,我们正在我的组织中使用2.3。自spark 1.5版本起,spark?array_包含的该版本上的任何选项都可用。所以你应该好好使用它。@RamdevSharma啊。正确的。与
2.4中添加的所有新数组函数混淆