繁体   English   中英

如何使用spark从数据框中找到最大长度的唯一行?

[英]How to find the max length unique rows from a dataframe with spark?

我试图在 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 轻松做到这一点......提前致谢

注意:此方法负责向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")
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|
+---+----+----+----+----+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM