web-dev-qa-db-fra.com

PySpark - Ajouter une fonction de carte en tant que colonne

J'ai un pyspark DataFrame

a = [
    ('Bob', 562),
    ('Bob',880),
    ('Bob',380),
    ('Sue',85),
    ('Sue',963)
] 
df = spark.createDataFrame(a, ["Person", "Amount"])

J'ai besoin de créer une colonne qui hache le Amount et renvoie le montant. Le problème est que je ne peux pas utiliser un UDF donc j'ai utilisé une fonction de mappage.

df.rdd.map(lambda x: hash(x["Amount"]))
5
Bryce Ramgovind

Si vous ne pouvez pas utiliser udf, vous pouvez utiliser la fonction map, mais comme vous l'avez actuellement écrit, il n'y aura qu'une seule colonne. Pour conserver toutes les colonnes, procédez comme suit:

df = df.rdd\
    .map(lambda x: (x["Person"], x["Amount"], hash(str(x["Amount"]))))\
    .toDF(["Person", "Amount", "Hash"])

df.show()
#+------+------+--------------------+
#|Person|Amount|                Hash|
#+------+------+--------------------+
#|   Bob|   562|-4340709941618811062|
#|   Bob|   880|-7718876479167384701|
#|   Bob|   380|-2088598916611095344|
#|   Sue|    85|    7168043064064671|
#|   Sue|   963|-8844931991662242457|
#+------+------+--------------------+

Remarque : Dans ce cas, hash(x["Amount"]) n'est pas très intéressant, donc je l'ai changé en hachage Amount converti en un chaîne.

Essentiellement, vous devez mapper la ligne à un Tuple contenant toutes les colonnes existantes et ajouter de nouvelles colonnes.

Si vos colonnes sont trop nombreuses pour être énumérées, vous pouvez également simplement ajouter un Tuple à la ligne existante.

df = df.rdd\
    .map(lambda x: x + (hash(str(x["Amount"])),))\
    .toDF(df.columns + ["Hash"])\

Je dois également souligner que si le hachage des valeurs est votre objectif final, il existe également une fonction pyspark pyspark.sql.functions.hash qui peut être utilisée pour éviter la sérialisation vers rdd:

import pyspark.sql.functions as f
df.withColumn("Hash", f.hash("Amount")).show()
#+------+------+----------+
#|Person|Amount|      Hash|
#+------+------+----------+
#|   Bob|   562|  51343841|
#|   Bob|   880|1241753636|
#|   Bob|   380| 514174926|
#|   Sue|    85|1944150283|
#|   Sue|   963|1665082423|
#+------+------+----------+

Cela semble utiliser un algorithme de hachage différent de celui de la fonction intégrée python.

14
pault