如何将函数应用于DataFrame列?

时间:2019-10-20 20:50:52

标签: apache-spark pyspark pyspark-sql

Spark中包含以下内容。它很棒。我只是想知道如何在Spark数据帧上以相同的方式运行函数。我知道我可以在下面使用Lambda,我只是想看看我是否可以运行更大的功能(以及如何运行)

def printline(x):
    return x*2

#The map function creates a new RDD with 1 to 1 mapping from the old
rdd3= rdd2.map(printline)
rdd3.take(5)

因此,如果我在数据帧中有相同对象,并且想调用自定义函数以对特定字段执行操作,那我该怎么办?

df = my_spark.read.format("csv").option("header", "false").load(r"c:\Users\kiera\Downloads\fakefriends.csv")

#Rename columns to make them easier to work with
df = df.withColumnRenamed('_c0', 'UserID')\
        .withColumnRenamed('_c1', 'Name')\
        .withColumnRenamed('_c2', 'Age')\
        .withColumnRenamed('_c3', 'Friends')

1 个答案:

答案 0 :(得分:2)

printline是Python函数。

RDD API是Spark开发人员的低级API,这就是为什么通常更容易推断出使用RDD API的Spark应用程序的原因。那是Spark Core。

DataFrame API是供Spark开发人员使用SQL的高级API(数据工程师?),即Spark SQL(基于Spark Core构建)。

问题是如何针对与RDD API非常相似的内容来丰富Spark SQL中可用的标准功能。那是用户定义的函数(UDF)。


以下内容是表示将printline函数应用于rdd2中的每一行(记录)(这应尽可能接近Python的熊猫和Scala的Collection API)。

rdd3= rdd2.map(printline)
rdd3.take(5)

等效项是使用用户定义的函数和DataFrame.withColumn运算符。他们是一样的。

伪代码如下:

df3 = df2.withColumn("nameOfTheColumn", printlineUDF(comma-separated column names))
df3.take(5)

请注意,您使用的是Row类型的DataFrame API,而您使用的是RDD API类型的对象。