【问题标题】:How to find the max length unique rows from a dataframe with spark?如何从带有火花的数据框中找到最大长度的唯一行?
【发布时间】:2019-12-26 12:59:38
【问题描述】:

我正在尝试在 Spark 数据帧中查找具有最大长度值的唯一行(基于 id)。每个 Column 都有一个字符串类型的值。

数据框是这样的:

+-----+---+----+---+---+
|id | A | B  | C  | D  |
+-----+---+----+---+---+
|1 |toto|tata|titi|    |
|1 |toto|tata|titi|tutu|
|2 |bla |blo |   |     |
|3 |b   | c  |   |  d  |
|3 |b   | c  |  a |  d |
+-----+---+----+---+---+

期望是:

+-----+---+----+---+---+
|id | A | B  | C  | D  |
+-----+---+----+---+---+
|1 |toto|tata|titi|tutu|
|2 |bla |blo |   |     |
|3 |b   | c  |  a |  d |
+-----+---+----+---+---+

我不知道如何使用 Spark 轻松做到这一点... 提前致谢

【问题讨论】:

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


    【解决方案1】:

    注意:这种方法可以处理对DataFrame 的任何添加/删除列,而无需更改代码。

    可以先找到拼接后所有列的长度(第一列除外),然后过滤除最大长度行之外的所有其他行。

    import org.apache.spark.sql.expressions._
    import org.apache.spark.sql.functions._
    
    val output = input.withColumn("rowLength", length(concat(input.columns.toList.drop(1).map(col): _*)))
      .withColumn("maxLength", max($"rowLength").over(Window.partitionBy($"id")))
      .filter($"rowLength" === $"maxLength")
      .drop("rowLength", "maxLength")
    

    【讨论】:

    • 谢谢!但是在有两行具有相同 id 的情况下,它会返回这两行。我如何只能在两者之间选择一个(最后在 id 上有所不同)?
    • 也许我只需要 dropDuplicates on id !再次感谢您的帮助!
    【解决方案2】:
    scala> df.show
    +---+----+----+----+----+
    | id|   A|   B|   C|   D|
    +---+----+----+----+----+
    |  1|toto|tata|titi|    |
    |  1|toto|tata|titi|tutu|
    |  2| bla| blo|    |    |
    |  3|   b|   c|    |   d|
    |  3|   b|   c|   a|   d|
    +---+----+----+----+----+
    
    
    scala> df.groupBy("id").agg(concat_ws("",collect_set(col("A"))).alias("A"),concat_ws("",collect_set(col("B"))).alias("B"),concat_ws("",collect_set(col("C"))).alias("C"),concat_ws("",collect_set(col("D"))).alias("D")).show
    +---+----+----+----+----+
    | id|   A|   B|   C|   D|
    +---+----+----+----+----+
    |  1|toto|tata|titi|tutu|
    |  2| bla| blo|    |    |
    |  3|   b|   c|   a|   d|
    +---+----+----+----+----+
    

    【讨论】:

    • 更多列,然后呢?
    猜你喜欢
    • 2019-07-13
    • 2019-06-13
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2018-09-30
    • 2016-06-27
    • 1970-01-01
    相关资源
    最近更新 更多