Scala 如何使用spark从数据帧中查找最大长度的唯一行?
我正在尝试查找Spark数据帧中具有最大长度值的唯一行(基于id)。每列都有一个字符串类型的值 数据帧类似于:Scala 如何使用spark从数据帧中查找最大长度的唯一行?,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我正在尝试查找Spark数据帧中具有最大长度值的唯一行(基于id)。每列都有一个字符串类型的值 数据帧类似于: +-----+---+----+---+---+ |id | A | B | C | D| +-----+---+----+---+---+ |1 |托托|塔塔|提提|| |1 |托托|塔塔|提提|图图| |2 | bla | blo || |3 | b | c | d| |3 | b | c | a | d| +-----+---+----+---+---+ 期望是: +-----
+-----+---+----+---+---+
|id | A | B | C | D|
+-----+---+----+---+---+
|1 |托托|塔塔|提提||
|1 |托托|塔塔|提提|图图|
|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> 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|
+---+----+----+----+----+
这可以通过在连接后首先查找所有列的长度(第一列除外),然后过滤除具有最大长度的行之外的所有其他行来完成
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上有点不同)?也许我不得不在id上删除重复项!再次感谢你的帮助!