如何将函数应用于 DataFrame 列?

How to apply a function to a DataFrame column?

我在 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')

printline 是一个 Python 函数。

RDD API 是 Spark 开发人员的 low-level API,这就是为什么使用 RDD API 的 Spark 应用程序通常更容易推理。那是 Spark 核心。

DataFrame API 是 high-level API 的 Spark 开发人员 SQL (数据工程师?)这就是 Spark SQL (那建立在 Spark Core 之上)。

问题是如何为与 RDD API 非常相似的东西丰富 Spark SQL 中可用的标准函数。那是 user-defined 函数(UDF)。


下面是表示将printline函数应用于rdd2中的每一行(记录)(这与Python的pandas和Scala的一样接近Collection API 尽可能)。

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

等效于使用 user-defined 函数和 DataFrame.withColumn 运算符。他们是一样的。

A pseudo-code 将如下所示:

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

请注意,您在 DataFrame API 中使用 Row,而在 RDD API objects 中属于您的类型。