我们在用python原生的函数来处理迭代我们的数据,但是我们发现在处理一个比较大的dataframe可能会花费我们很久的时间。所以如果我们拥有一个集群,那么如何在集群上通过Pyspark来加速我们的处理速度呢?换句话说我们如何将python函数转化成Spark的用户自定义函数(UDF)呢?
注册一个UDF
Pyspark UDFs跟pandas的series和dataframes的.map()和.apply()方法类似。我可以将dataframe中的行作为函数的输入值,然后我们可以遍历整个dataframe。那唯一的区别是PySpark UDFs必须定义输出数据的类型。
举个例子,我从pandas的dataframe中创建一个PySpark的dataframe。
import pandas as pd
from pyspark.sql import SparkSession
spark = SparkSession \
.builder \
.appName("basic-op-price-fluctuate") \
.master("local") \
.config("fs.defaultFS","hdfs://host1:8020") \
.getOrCreate()
spark.sparkContext.setLogLevel("WARN")
spark.conf.set("spark.sql.execution.arrow.enabled", "true")
df_pd = pd.DataFrame(
data={'integers':[1,2,3],
'floats':[-1.0,0.6,2.6],
'integer_arrays':[[1,2],[3,4.6],[5,6,8,9]]}
)
df = spark.createDataFrame(df_pd)
df.printSchema()
df.show()