【Spark】用udf和withColumn在dafaframe中创建新列

udf使用

import org.apache.spark.sql.functions.udf

udf接收一个函数(func)作为参数,返回一个UserDefinedFunction。

UserDefinedFunction接收列(Column)作为参数,并返回Column.

func可以接收普通类型参数,并返回普通类型结果。

udf会自动把Column入参转化成对应func的入参,并将func返回的结果转化成Column类型。、

注意由于udf限制。func最多接收10个参数

scala 复制代码
import org.apache.spark.sql.functions._
//一个或多个参数
val UDF0= udf{
	(c1:String,c2:Int,...,)=> 函数体
}

df.withColumn("new",UDF0(col("old1"),col("old2")...))

//整行输入
val UDF1= udf{
	(row: Row) => 处理Row类型的函数体,最好返回常规类型
}

val columns = df.columns

df.withColumn("new",UDF1(struct(columns.map(x=>col(x)): _*))

// 注册到sql中使用
 df.createOrReplaceTempView("tempview")
 spark.udf.register("UDF0", UDF0)
 spark.sql("select *, UDF0(struct(`old1`, `old2`, `...`)) as new from tempview").show(100)

struct函数说明:

scala 复制代码
def struct(colName: String, colNames: String*): Column
// Creates a new struct column that composes multiple input columns.
def struct(cols: Column*): Column
// Creates a new struct column. If the input column is a column in a DataFrame, or a derived column expression that is named (i.e. aliased), its name would be retained as the StructField's name, otherwise, the newly generated StructField's name would be auto generated as col with a suffix index + 1, i.e. col1, col2, col3, ...

参考

create-new-column-with-function-in-spark-dataframe

【官方】udf使用
【官方】udf接口
Spark SQL UDF (User Defined Functions)

相关推荐
青云交2 小时前
Java 大视界 -- Java 大数据在智能安防人脸识别系统中的活体检测与防伪技术应用
java·大数据·生成对抗网络·人脸识别·智能安防·防伪技术·活体测试
chenglin0162 小时前
ES_索引模板
大数据·elasticsearch·jenkins
byte轻骑兵4 小时前
大数据时代时序数据库选型指南:深度解析与 Apache IoTDB 实践
大数据·apache·时序数据库
NPE~5 小时前
[docker/大数据]Spark快速入门
大数据·分布式·docker·spark·教程
的小姐姐6 小时前
AI与IIOT如何重新定义设备维护系统?_璞华大数据Hawkeye平台
大数据·人工智能
TDengine (老段)7 小时前
TDengine IDMP 最佳实践
大数据·数据库·物联网·ai·时序数据库·tdengine·涛思数据
芜青7 小时前
JavaScript手录18-ajax:异步请求与项目上线部署
开发语言·javascript·ajax
彬彬醤7 小时前
Mac怎么连接VPS?可以参考这几种方法
大数据·运维·服务器·数据库·线性代数·macos·矩阵
星域智链8 小时前
车载 GPS 与手机导航的终极对决:谁在复杂路况下更胜一筹?
大数据·科技·ai
MaxCode-19 小时前
单智能体篇:Prompt工程艺术
大数据·人工智能·prompt