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')
答案 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类型的对象。