web-dev-qa-db-fra.com

Passer un tableau à Python Spark fonction allumée)

Disons que j'ai un tableau numpy a qui contient les nombres 1-10. Donc a est [1 2 3 4 5 6 7 8 9 10].

Maintenant, j'ai également un Python Spark dataframe auquel je veux ajouter mon tableau numpy a. Je pense qu'une colonne de littéraux fera le travail). Je fais donc ce qui suit:

df = df.withColumn("NewColumn", F.lit(a))

Ça ne marche pas. L'erreur est "Classe de type littéral non prise en charge Java.util.ArrayList".

Maintenant, si j'essaye juste un élément du tableau, comme suit, cela fonctionne.

df = df.withColumn("NewColumn", F.lit(a[0]))

Existe-t-il un moyen de faire ce que j'essaie? Je travaille sur la tâche que je veux accomplir depuis des jours et c'est le plus près que je suis venu de la terminer. J'ai regardé toutes les questions relatives au débordement de pile, mais je n'ai pas obtenu la réponse que je cherchais. Toute aide est appréciée. Merci.

14
A. R.

pour la boucle dans la fonction intégrée du tableau

Vous pouvez utiliser array fonction intégrée comme

a = [1,2,3,4,5,6,7,8,9,10]
df = spark.createDataFrame([['a b c d e f g h i j '],], ['col1'])
df = df.withColumn("NewColumn", F.array([F.lit(x) for x in a]))
df.show(truncate=False)

Tu devrais obtenir

+--------------------+-------------------------------+
|col1                |NewColumn                      |
+--------------------+-------------------------------+
|a b c d e f g h i j |[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]|
+--------------------+-------------------------------+
root
 |-- col1: string (nullable = true)
 |-- NewColumn: array (nullable = false)
 |    |-- element: integer (containsNull = false)

Utilisation de la fonction udf

#udf function
def arrayUdf():
    return a
callArrayUdf = F.udf(arrayUdf, T.ArrayType(T.IntegerType()))

#calling udf function
df = df.withColumn("NewColumn", callArrayUdf())

la sortie est la même que pour la boucle

mis à jour

Je colle le commentaire de @ pault donné ci-dessous

Vous pouvez masquer la boucle en utilisant map: df.withColumn("NewColumn", F.array(map(F.lit, a)))

18
Ramesh Maharjan