如何从带有火花的数据框中找到最大长度的唯一行?

Posted

技术标签:

【中文标题】如何从带有火花的数据框中找到最大长度的唯一行?【英文标题】: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 轻松做到这一点... 提前致谢

【问题讨论】:

【参考方案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|
+---+----+----+----+----+

【讨论】:

更多列,然后呢?

以上是关于如何从带有火花的数据框中找到最大长度的唯一行?的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 数据框中查找唯一值,无论行或列位置如何

如何从火花数据框中提取 csv 名称

计算火花数据框中的字数

火花数据集:如何从列中获取唯一值的出现次数

如何从 Python 3.5 中的数据框中找到最大值的确切位置-修改

如何计算数据框中的唯一行?