如何从带有火花的数据框中找到最大长度的唯一行?
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|
+---+----+----+----+----+
【讨论】:
更多列,然后呢?以上是关于如何从带有火花的数据框中找到最大长度的唯一行?的主要内容,如果未能解决你的问题,请参考以下文章