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"])
3 Réponses :
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| +----+----+-----+-----+
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 $
Utilisez l'approche simple ci-dessous:
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 | +----+----+-----+-----+