【问题标题】:Rolling up multiple rows into a single row and column in spark在火花中将多行卷成单行和列
【发布时间】:2020-11-24 01:32:52
【问题描述】:

我有一个火花 DF,如下所示。我需要将具有相同 ID 的多行汇总为单行,但值应该是不同的。

id|values
1 |hello
1 |hello Sam
1 |hello Tom
2 |hello
2 |hello Tom

预期输出

id|values
1 |hello, Sam, Tom
2 |hello, Tom

我已经完成了汇总部分,但是如何过滤重复的令牌?

当前代码:

df.select("id","values")
  .groupBy("id")
  .agg(concat_ws(",", collect_list("values")))

问题的第二部分: 我也通过 SQL 尝试过,但它也显示了重复项。

spark.sql("select id, concat_ws(' ' ,collect_set(values)) as values from data group by id ").show(false)
+---+----------------------------+
|id |values                      |
+---+----------------------------+
|1  |hello hello Sam hello Tom   |
|2  |hello hello Tom             |
+---+----------------------------+

如何去除上述查询中的重复项

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    你可以使用collect_set作为

    df.select("id","values").groupBy("id").agg(concat_ws(",",collect_set("values")))

    更新:

    如果你的字符串用空格分隔,那么上面的就行不通了

    您需要使用空格分割并使用 udf 找到不同的,如下所示

    val tokenize = udf((value: Seq[String]) => {
      value.flatMap(_.split(",|\\s+")).map(_.trim).distinct
    })
    
    df.select("id", "values").groupBy("id").agg(collect_list("values").as("value"))
        .withColumn("value1", tokenize($"value"))
    
    .show(false)
    

    输出:

    +---+-----------------+
    |id |value            |
    +---+-----------------+
    |1  |[hello, Sam, Tom]|
    |2  |[hello, Tom]     |
    +---+-----------------+
    

    【讨论】:

    • 我们的价值观是什么? Array[String] 还是单个字符串?
    • 现在它是单个字符串[用空格分隔],但它也可以是一个数组[字符串]
    • 如果它是由空格分隔的单个字符串,那么这将不起作用,您需要 udf 使其不同。
    • 我知道在这个论坛上问这个问题不是一个正确的问题,但你能帮我解决这个问题吗?
    • 不能同时拥有array[string]和单个string,你会只有一个吗?那我可以帮你
    【解决方案2】:

    对于寻找 100% sql 解决方案的人来说,这样的事情对我来说可以为我正在寻找的列表生成一个逗号分隔的字符串表示:

    select  
      patient_id, 
      concat_ws(",", collect_set(distinct encounter_id)) enc_list, 
      count(distinct encounter_id) enc_count
    from
      encounter 
    group by 1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多