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

y

我有一个带有数组类型列的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"))

这似乎不起作用。任何输入我该怎么做?

智慧

array_contains测试条件方法:

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<string>]

df.show
+---+--------+
| id|arrayCol|
+---+--------+
|  1|  [a, b]|
|  1|     [b]|
|  2|     [b]|
+---+--------+


df.groupBy("id").agg(
  count(when(array_contains($"arrayCol", "a"), $"arrayCol")).as("hasA")
).show
+---+----+
| id|hasA|
+---+----+
|  1|   1|
|  2|   0|
+---+----+

或使用sum

df.groupBy("id").agg(
  sum(when(array_contains($"arrayCol", "a"), 1).otherwise(0)).as("hasA")
).show
+---+----+
| id|hasA|
+---+----+
|  1|   1|
|  2|   0|
+---+----+

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spark 数据帧 groupBy 和基于列值的进一步求和聚合

基于连续列值拆分数据帧,数据帧中不存在

R基于多个列进行聚合,然后合并到数据帧中?

Spark:如何对数据帧中的字符串数组进行聚合操作

如何基于R中的多个列聚合数据帧?

查找数据帧中是否存在列

在 Spark 数据帧中查找非空值的计数

根据列中特定值的计数条件过滤出spark数据帧的行[pyspark中的spark.sql语法]

将数据帧列的数组展平为单独的列和 Spark scala 中的相应值

基于Scala中的关键列合并Spark数据帧行

基于列或相邻列中的值的数据帧子集

如何基于R中的列对数据帧进行分类?

从Postgres DB中读取Spark数据帧作为数组类型

如何提取列值以与Spark数据帧中的Rlike进行比较

基于值计数的数据帧上的 Apache Spark 自定义 groupBy

基于R中的列值聚合数据框

基于R中另一列的值进行计数

Spark- 基于值的数据帧扫描

根据列数据类型对 spark 数据帧(在 sparklyr 中)进行子集化的最佳方法是什么

在spark数据帧的同一列上进行多个聚合操作

在列中对集合类型中的值进行计数

如何基于已知字符向量对数据帧下序列中的字符进行计数

基于数据帧中列中的值的数据帧行的交集

计算 Spark (Scala) 中数据帧列中的空值

Spark:在 Scala 中的数据帧上使用动态过滤器进行聚合

Spark - 如何为 countVectorizer 模型创建在其一列中包含值数组的 Spark 数据帧

如何在Spark数据帧中合并数组列

基于字符串的第一列聚合R中的数据帧

获取基于数据帧列中特定值的所有数据帧