Comment puis-je ajouter un élément à un tableau dans dataframe (spark 2.3)?
Voici un exemple avec des entiers, mais le cas réel est avec struct.
Entrée:
+-------------+ | my_arr | +-------------+ |[3,14,5] | |[9,5.99,3] | +-------------+
sortie :
+------+-------------+ | key| my_arr | +------+-------------+ |5 |[3,14] | |3 |[9,5.99] | +------+-------------+
3 Réponses :
vous devez créer udf pour ajouter des éléments, avec un entier c'est facile mais avec struct c'est plus compliquer.
Avec des entiers de code est:
`
val schemaTyped = new StructType()
.add("name", StringType)
.add("age", IntegerType)
val schema = ArrayType(schemaTyped)
val udfConcatStruct = udf((key: Row, my_arr: Seq[Row]) => my_arr :+ key, schema)
df2.withColumn("my_arr", udfConcatStruct(col("key"), col("my_arr"))).drop("key").show(false)
`
Avec une structure de code est: p>
`
val udfConcat = udf((key:Int,my_arr:WrappedArray[Int])=> my_arr:+key)
df.withColumn("my_arr",udfConcat(col("key"), col("my_arr"))).drop("key").show()
`
Lorsque vous créez l'udf, vous devez passer le schéma de Array, dans cet exemple est un tableau d'élément avec des noms et des âges.
Merci :), j'essayais d'éviter d'utiliser UDF qui accepte 2 colonnes car de mauvaises performances, mais je pense que je n'ai pas le choix
Voici une autre façon d'utiliser Struct:
Input:
+---+--------+ |Key|My_Array| +---+--------+ |5 |[3,14,5]| |3 |[9,45,3]| +---+--------+
Output:
df.show()
+---+--------+
|Key|My_Array|
+---+--------+
| 5| [3,14]|
| 3| [9,45]|
+---+--------+
df.withColumn("My_Array", struct($"My_Array.*", $"Key")).show(false)
Solution sans UDF - PYSPARK
J'étais confronté à un problème similaire et je ne voulais absolument pas utiliser UDF en raison de la dégradation des performances
spark_df=spark_df.\
withColumn("myarr",F.split(F.concat(F.concat_ws(",",F.col("myarr")),F.lit(",") ,F.col("key")),",\s*" ) )
spark_df.select("myarr").show(3,False)
+------------+
|myarr |
+------------+
|[3.0,14.0,5]|
|[9.0,5.99,3]|
+------------+
Sortie:
spark_df.show(3,False)
+---+-----------+
|key|myarr |
+---+-----------+
|5 |[3.0, 14.0]|
|3 |[9.0, 5.99]|
+---+-----------+
Étapes de la méthode:
J'espère que cela vous aidera.
Les DataFrames sont immuables: databricks.com/blog/2016/07/14/...
@WalrustheCat - Il est vrai qu'une dataframe est immuable, mais les dataframes peuvent être transformées en nouvelles dataframes (l'idée même de construire un pipeline de transformation).