【问题标题】:Count of occurences of multiple values in array of string column in spark <2.2 and scalaspark <2.2和scala中字符串列数组中多个值的出现计数
【发布时间】:2021-06-07 19:02:01
【问题描述】:

我需要找到数组中特定元素的出现次数,我们可以使用array_contains 函数,但我正在寻找另一种可以在 spark 2.2 下工作的解决方案

输入:

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

result1 -> 在给定数组列array_col2 中出现1,2 的计数

result2 -> 在给定数组列array_col2 中出现3,7,9 的计数

预期输出:

+----+------------------+----------+----------+ 
|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| 
+----+------------------+----------+----------+

【问题讨论】:

    标签: scala apache-spark pyspark apache-spark-sql


    【解决方案1】:

    你可以使用UDF:

    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|
    //+----+------------------+-------+-------+
    

    你也可以先分解数组然后 groupby 和 count :

    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")
      )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      相关资源
      最近更新 更多