1
votes

Appeler une fonction pour chaque ligne d'une dataframe dans pyspark [non pandas]

Il y a une fonction dans pyspark:

+----------+----------+-----------+
|     NUM1 |     NUM2 |    XYZ    |
+----------+----------+-----------+
|      10  |     20   |      HELLO|                                    
|      90  |     60   |      WORLD|
|      50  |     45   |      SPARK|
+----------+----------+-----------+


+----------+----------+-----------+------+
|     NUM1 |     NUM2 |    XYZ    | VALUE|
+----------+----------+-----------+------+
|      10  |     20   |      HELLO|30    |                                     
|      90  |     60   |      WORLD|150   |
|      50  |     45   |      SPARK|95    |
+----------+----------+-----------+------+

Python: 3.7.4
Spark: 2.2

Elle doit être exécutée sur chaque enregistrement d'une très très grande trame de données en utilisant spark sql:

x = sum(df.select["NUM1"].first()["NUM1"], df.select["NUM2"].first()["NUM2"])


0 commentaires

3 Réponses :


2
votes

Vous pouvez utiliser la fonction .withColumn:

from pyspark.sql.functions import col
from pyspark.sql.types import LongType
df.show()
+----+----+-----+
|NUM1|NUM2|  XYZ|
+----+----+-----+
|  10|  20|HELLO|
|  90|  60|WORLD|
|  50|  45|SPARK|
+----+----+-----+

def mysum(a,b):
  return a + b

spark.udf.register("mysumudf", mysum, LongType())

df2 = df.withColumn("VALUE", mysum(col("NUM1"),col("NUM2"))

df2.show()
+----+----+-----+-----+
|NUM1|NUM2|  XYZ|VALUE|
+----+----+-----+-----+
|  10|  20|HELLO|   30|
|  90|  60|WORLD|  150|
|  50|  45|SPARK|   95|
+----+----+-----+-----+


4 commentaires

Solution en python pls. $ n'est pas là en python et cela me crée des problèmes


J'essaierai sum (df ['NUM1'], df ['NUM2']). En réalité, je dois appeler cette fonction dans l'instruction select elle-même. Cela ne devrait pas être un problème. Ce serait select sum (df ['NUM1'], df ['NUM2']) de abc. Cela devrait fonctionner je suppose


Dans l'instruction select, il lance une erreur. df ['NUM1'] est imprimé en tant que colonne , ce qui est faux. Je veux que ce soit la valeur réelle de cette colonne. Et la même chose doit être appliquée pour tous les enregistrements du df sur lequel select s'exécute


ouais, c'est exactement à quoi sert la fonction withColumn, elle applique une fonction à chaque ligne, sur la colonne sélectionnée. J'ai corrigé l'utilisation de $



0
votes

Utilisez l'approche simple ci-dessous:

  1. Importer les fonctions pyspark.sql
    depuis les fonctions d'importation de pyspark.sql comme F
  2. Utiliser la fonction F.expr ()
    df.withColumn ("VALUE", F.expr ("NUM1 + NUM2")

0 commentaires

0
votes

Nous pouvons le faire de la manière ci-dessous et lors de l'enregistrement du troisième argument udf qui est de type de retour n'est pas obligatoire.

from pyspark.sql import functions as F
df1 = spark.createDataFrame([(10,20,'HELLO'),(90,60,'WORLD'),(50,45,'SPARK')],['NUM1','NUM2','XYZ'])
df1.show()
df2=df1.withColumn('VALUE',F.expr('NUM1 + NUM2'))
df2.show(3,False)
+----+----+-----+-----+
|NUM1|NUM2|XYZ  |VALUE|
+----+----+-----+-----+
|10  |20  |HELLO|30   |
|90  |60  |WORLD|150  |
|50  |45  |SPARK|95   |
+----+----+-----+-----+


(or)

def sum(c1,c2):
    return c1+c2
spark.udf.register('sum_udf1',sum)
df2=df1.withColumn('VALUE',F.expr("sum_udf1(NUM1,NUM2)"))
df2.show(3,False)
+----+----+-----+-----+
|NUM1|NUM2|XYZ  |VALUE|
+----+----+-----+-----+
|10  |20  |HELLO|30   |
|90  |60  |WORLD|150  |
|50  |45  |SPARK|95   |
+----+----+-----+-----+
(or)

sum_udf2=F.udf(lambda x,y: x+y)
df2=df1.withColumn('VALUE',sum_udf2('NUM1','NUM2'))
df2.show(3,False)
+----+----+-----+-----+
|NUM1|NUM2|XYZ  |VALUE|
+----+----+-----+-----+
|10  |20  |HELLO|30   |
|90  |60  |WORLD|150  |
|50  |45  |SPARK|95   |
+----+----+-----+-----+


0 commentaires