1
votes

Comment ajouter un élément au tableau dans Spark 2.3

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]     |
+------+-------------+


2 commentaires

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


3 Réponses :


1
votes

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.


1 commentaires

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



1
votes

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)


0 commentaires

0
votes

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:

  1. Commencez par convertir la colonne Array en String à l'aide de concat_ws méthode
  2. Utilisez la fonction concat pour fusionner la colonne requise ("clé") avec la colonne d'origine ("myarr")
  3. Utilisez la fonction split pour convertir la colonne chaîne de l'étape ci-dessus en Array

J'espère que cela vous aidera.


0 commentaires