Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何使用spark从数据帧中查找最大长度的唯一行?_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala 如何使用spark从数据帧中查找最大长度的唯一行?

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| +-----+---+----+---+---+ 期望是: +-----

我正在尝试查找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 |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上删除重复项!再次感谢你的帮助!