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).