在 pyspark[non pandas] 中为数据帧的每一行调用一个函数
Call a function for each row of a dataframe in pyspark[non pandas]
pyspark中有一个函数:
def sum(a,b):
c=a+b
return c
使用 spark sql:
在非常非常大的数据帧的每条记录上必须 运行
x = sum(df.select["NUM1"].first()["NUM1"], df.select["NUM2"].first()["NUM2"])
但是这 运行 它只适用于 df 的第一条记录,而不适用于所有行。
我知道可以使用 lambda 来完成,但我无法以所需的方式对其进行编码。
现实中; c 将是一个数据框,该函数将做很多 spark.sql 和 return 的事情。我将不得不为每一行调用该函数。
我想,我会试着用这个 sum(a,b)
来打个比方。
+----------+----------+-----------+
| 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
您可以使用 .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|
+----+----+-----+-----+
使用下面的简单方法:
1.导入 pyspark.sql 函数
from pyspark.sql import functions as F
2。使用 F.expr() 函数
df.withColumn("VALUE",F.expr("NUM1+NUM2")<br>
我们可以通过以下方式完成,同时注册 udf 第三个参数 return 类型不是强制性的。
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 |
+----+----+-----+-----+
pyspark中有一个函数:
def sum(a,b):
c=a+b
return c
使用 spark sql:
在非常非常大的数据帧的每条记录上必须 运行x = sum(df.select["NUM1"].first()["NUM1"], df.select["NUM2"].first()["NUM2"])
但是这 运行 它只适用于 df 的第一条记录,而不适用于所有行。 我知道可以使用 lambda 来完成,但我无法以所需的方式对其进行编码。
现实中; c 将是一个数据框,该函数将做很多 spark.sql 和 return 的事情。我将不得不为每一行调用该函数。
我想,我会试着用这个 sum(a,b)
来打个比方。
+----------+----------+-----------+
| 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
您可以使用 .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|
+----+----+-----+-----+
使用下面的简单方法:
1.导入 pyspark.sql 函数
from pyspark.sql import functions as F
2。使用 F.expr() 函数
df.withColumn("VALUE",F.expr("NUM1+NUM2")<br>
我们可以通过以下方式完成,同时注册 udf 第三个参数 return 类型不是强制性的。
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 |
+----+----+-----+-----+