Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 在pyspark[非pandas]中为数据帧的每一行调用函数_Apache Spark_Pyspark_Pyspark Sql_Pyspark Dataframes - Fatal编程技术网

Apache spark 在pyspark[非pandas]中为数据帧的每一行调用函数

Apache spark 在pyspark[非pandas]中为数据帧的每一行调用函数,apache-spark,pyspark,pyspark-sql,pyspark-dataframes,Apache Spark,Pyspark,Pyspark Sql,Pyspark Dataframes,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将是一个数据帧,函数将执行大量spa

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操作并返回它。我必须为每一行调用该函数。 我想,我会试着用这个
和(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|
+----+----+-----+-----+

使用以下简单方法:

  • 导入pyspark.sql函数
    从pyspark.sql导入函数为F
  • 使用F.expr()函数
    df.带列(“值”,F.expr(“NUM1+NUM2”)

  • 我们可以用下面的方法来实现,注册udf时,返回类型的第三个参数不是必需的

    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   |
    +----+----+-----+-----+
    

    python中的解决方案请注意:$在python中不存在,这给meI带来了麻烦。meI将尝试sum(df['NUM1'],df['NUM2'])。实际上,我必须在select语句中调用此函数。这不应该是个问题。这将是abc中的select sum(df['NUM1'],df['NUM2'])。我猜在select语句中它会抛出错误。df['NUM1']被打印为列,这是错误的。我希望这是该列的实际值。同样需要应用于select运行的df的所有记录。是的,这正是withColumn函数的用途,它对所选列的每一行应用一个函数。我更正了$