Dans Spark 1.6.0/Scala, y a-t-il une possibilité d'obtenir collect_list("colC")
ou collect_set("colC").over(Window.partitionBy("colA").orderBy("colB")
?
Étant donné que vous avez dataframe
comme
+----+----+----+
|colA|colB|colC|
+----+----+----+
|1 |1 |23 |
|1 |2 |63 |
|1 |3 |31 |
|2 |1 |32 |
|2 |2 |56 |
+----+----+----+
Vous pouvez Window
fonctions en procédant comme suit
import org.Apache.spark.sql.functions._
import org.Apache.spark.sql.expressions._
df.withColumn("colD", collect_list("colC").over(Window.partitionBy("colA").orderBy("colB"))).show(false)
Résultat:
+----+----+----+------------+
|colA|colB|colC|colD |
+----+----+----+------------+
|1 |1 |23 |[23] |
|1 |2 |63 |[23, 63] |
|1 |3 |31 |[23, 63, 31]|
|2 |1 |32 |[32] |
|2 |2 |56 |[32, 56] |
+----+----+----+------------+
Le résultat est similaire pour collect_set
ainsi que. Mais l'ordre des éléments dans le set
final ne sera pas dans l'ordre comme avec collect_list
df.withColumn("colD", collect_set("colC").over(Window.partitionBy("colA").orderBy("colB"))).show(false)
+----+----+----+------------+
|colA|colB|colC|colD |
+----+----+----+------------+
|1 |1 |23 |[23] |
|1 |2 |63 |[63, 23] |
|1 |3 |31 |[63, 31, 23]|
|2 |1 |32 |[32] |
|2 |2 |56 |[56, 32] |
+----+----+----+------------+
Si vous supprimez orderBy
comme ci-dessous
df.withColumn("colD", collect_list("colC").over(Window.partitionBy("colA"))).show(false)
le résultat serait
+----+----+----+------------+
|colA|colB|colC|colD |
+----+----+----+------------+
|1 |1 |23 |[23, 63, 31]|
|1 |2 |63 |[23, 63, 31]|
|1 |3 |31 |[23, 63, 31]|
|2 |1 |32 |[32, 56] |
|2 |2 |56 |[32, 56] |
+----+----+----+------------+
J'espère que la réponse est utile