J'ai ce dataframe:

+------+-----------+--------------------+                                       
|NewsId|    expNews|            transArr|
+------+-----------+--------------------+
|     1|      House|[house, HH, AW1, S] |
|     1|Republicans|[republicans, R, ...|
|     1|       Fret|[fret, F, R, EH1, T]|
|     1|      About|[about, AH0, B, A...|

Je veux supprimer chaque élément à l'index 0 dans les tableaux de la colonne transArr. Résultat attendu:

+------+-----------+--------------+                                       
|NewsId|    expNews|      transArr|
+------+-----------+--------------+
|     1|      House|[HH, AW1, S]  |
|     1|Republicans|[R, ...       |
|     1|       Fret|[F, R, EH1, T]|
|     1|      About|[AH0, B, A... |

Existe-t-il un moyen simple de faire cela avec Spark et Scala?

3
andersbs 19 oct. 2020 à 22:07

4 réponses

Meilleure réponse

Vérifiez le code ci-dessous, il est plus rapide que la fonction slice

scala> df.show(false)
+------+-----------+---------------------+
|NewsId|expNews    |transArr             |
+------+-----------+---------------------+
|1     |House      |[house, HH, AW1, S]  |
|1     |Republicans|[republicans, R, ...]|
|1     |Fret       |[fret, F, R, EH1, T] |
|1     |About      |[about, AH0, B, A...]|
+------+-----------+---------------------+
scala> df
.withColumn(
    "modified_transArr",
    array_except(
        $"transArr",
        array($"transArr"(0))
    )
).show(false)
+------+-----------+---------------------+-----------------+
|NewsId|expNews    |transArr             |modified_transArr|
+------+-----------+---------------------+-----------------+
|1     |House      |[house, HH, AW1, S]  |[HH, AW1, S]     |
|1     |Republicans|[republicans, R, ...]|[R, ...]         |
|1     |Fret       |[fret, F, R, EH1, T] |[F, R, EH1, T]   |
|1     |About      |[about, AH0, B, A...]|[AH0, B, A...]   |
+------+-----------+---------------------+-----------------+
2
Srinivas 20 oct. 2020 à 06:59

Une solution Spark 2.4+:

df.withColumn("transArr", array_except($"transArr", slice($"transArr",1,1)))

slice(arr,start,len) renverra le 1er élément sous forme de tableau et le soustrayera du tableau d'origine en utilisant array_except

1
Sanket9394 19 oct. 2020 à 19:29

Solution utilisant Spark UDF Prenez la queue du tableau. Assurez-vous que vous gérez la valeur nulle dans la colonne

    val parse_udf = udf(( value : Seq[String])=> value.tail)
df.withColumn("transArr", parse_udf($"transArr")).show()
1
david gupta 19 oct. 2020 à 20:07

Pour Spark 3.0+, vous pouvez utiliser la fonction filter avec un argument d'index supplémentaire:

df.withColumn("transArr", expr("filter(transArr, (x,i) -> i>0)"))
1
werner 19 oct. 2020 à 19:20