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