spark< 2.2和scala中字符串列数组中出现多个值的计数

s4n0splo  于 2021-07-12  发布在  Spark
关注(0)|答案(1)|浏览(314)

我需要找到数组中特定元素的出现次数,我们可以使用 array_contains 功能,但我正在寻找另一个解决方案,可以低于Spark2.2工作
输入:

+----+------------------+
|col1|        array_col2|
+----+------------------+
|   x|   [1, 2, 3, 7, 7]|
|   z|[3, 2, 8, 9, 4, 9]|
|   a|      [4, 5, 2, 8]|
+----+------------------+
``` `result1` ->事故发生次数 `1,2` 在给定的数组列中
array_col2 `result2` ->事故发生次数 `3,7,9` 在给定的数组列中 `array_col2` 预期产量:

+----+------------------+----------+----------+
|col1| array_col2| result1| result2|
+----+------------------+----------+----------+
| x| [1, 2, 3, 7, 7]| 2| 3|
| z|[3, 2, 8, 9, 4, 9]| 1| 3|
| a| [4, 5, 2, 8]| 1| 0|
+----+------------------+----------+----------+

am46iovg

am46iovg1#

您可以使用自定义项:

val count_occ = udf((s: Seq[Int], f: Seq[Int]) => s.filter(f.contains(_)).size)

val df1 = df.withColumn(
    "result1",
    count_occ($"array_col2", array(lit(1), lit(2)))
  ).withColumn(
    "result2",
    count_occ($"array_col2", array(lit(3), lit(7), lit(9)))
  )

df1.show
//+----+------------------+-------+-------+
//|col1|        array_col2|result1|result2|
//+----+------------------+-------+-------+
//|   x|   [1, 2, 3, 7, 7]|      2|      3|
//|   z|[3, 2, 8, 9, 4, 9]|      1|      3|
//|   a|      [4, 5, 2, 8]|      1|      0|
//+----+------------------+-------+-------+

您还可以分解数组,然后分组并计数:

val df1 = df.withColumn(
    "col2",
    explode($"array_col2")
  ).groupBy("col1", "array_col2").agg(
    count(when($"col2".isin(1, 2), 1)).as("result1"),
    count(when($"col2".isin(3, 7, 9), 1)).as("result2")
  )

相关问题