目录
udf
pyspark里面常常需要自定义函数进行数据处理
- udf是针对一行数据进行处理
- pandas_udf是针对一个series进行处理
- udfa是针对groupby之后的数据进行处理
应用类似于pandas里面的apply函数,
import numpy as np
from pyspark.sql import SparkSession
import pyspark.sql.functions as F
from pyspark.sql.types import StringType, FloatType
pandas_df = pd.DataFrame({
'row_number': np.arange(100000)})
spark_df = spark.createDataFrame(pandas_df)
spark_df.show(5)
+----------+
|row_number|
+----------+
| 0|
| 1|
| 2|
| 3|
| 4|
+----------+
# 定义udf函数,开根号
@F.udf(returnType=FloatType())
def cacl_sqrt(x):
return float(np.sqrt(x))
spark_df.withColumn('a2', cacl_sqrt('row_number')).show()
+----------+---------+
|row_number| a2|
+----------+---------+
| 0| 0.0|
| 1| 1.0|
| 2|1.4142135|
| 3|1.7320508|
| 4| 2.0|
- udf传入的参数x,就是row_number列里每一行数据
- udf默认返回是string,returnType建议指定好返回类型
- udf不支持numpy格式数据,需要转为基本类型float(np.sqrt(x))
聚合后结合collect_list使用udf,实现udaf功能
rdd = spark.sparkContext.parallelize([
(1, 2., 'sdsd|sdsd:sdsd', date(2000, 1, 1), datetime(2000, 1, 1, 12, 0)),
(1, 3., '20202_19001', date(2000, 2, 1), datetime(2000, 1, 2, 12, 0)),
(1, 3., '20202_19001', date(2000, 2, 1), datetime(2000, 1, 2, 12, 0)),
(1, 3., '20202_19001', date(2000, 2, 1), datetime(2000, 1, 2, 12, 0)),
(1, 3., '20202_19001', date(2000, 2, 1), datetime(2000, 1, 2, 12, 0)),<