Spark SQL 中UDF的讲解

Spark SQL进阶 spark sql 深度介绍,spark_dataFrame与pandas_dataFrame互转,基于pandas的完成自定义UDF函数,UDAF函数 阅读详情

Spark SQL 中UDF的讲解

User Define Function, 用户自定义函数,简称UDF,存在与很多组件中。

在使用Sparksql的人都遇到了Sparksql所支持的函数太少了的难处,除了最基本的函数,Sparksql所能支撑的函数很少,肯定不能满足正常的项目使用,UDF可以解决问题。

SparkSQL中的UDF相当于是1进1出,UDAF相当于是多进一出,类似于聚合函数。

开窗函数一般分组取topn时常用。

可以理解为自己定义函数,来获取自己想要的结果!
案例借鉴于网络!
需求:计算文本中每一个单词的长度!
代码:
Scala版本:
package com.bynear.Scala

import org.apache.spark.sql.types.{StringType, StructField, StructType}
import org.apache.spark.sql.{Row, SQLContext}
import org.apache.spark.{SparkConf, SparkContext}

object UDF {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("SparkSQL_UDF").setMaster("local")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)
    val names = Array("刘亦菲", "张柏芝", "冯提模","陈一发儿")
    val nameRDD = sc.parallelize(names, 5)
    val nameRowRDD = nameRDD.map(name => Row(name))
    val structType = StructType(Array(StructField("name", StringType, true)))
    val namesDF = sqlContext.createDataFrame(nameRowRDD, structType)
    namesDF.registerTempTable("names")
    sqlContext.udf.register("strLen", (str: String) => str.length)
    sqlContext.sql("select name,strLen(name) as length from names").show()
    sqlContext.sql("select name,strLen(name) as length from names").collect().foreach(println)

  }
}
运行结果:
+----+------+
|name|length|
+----+------+
| 刘亦菲|     3|
| 张柏芝|     3|
| 冯提模|     3|
|陈一发儿|     4|
+----+------+

[刘亦菲,3]
[张柏芝,3]
[冯提模,3]
[陈一发儿,4]

Java版本:
package com.bynear.spark_sql;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.sql.api.java.UDF1;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;

import java.util.ArrayList;
public class JavaUDF {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf().setAppName("JavaUDF").setMaster("local");
        JavaSparkContext sc = new JavaSparkContext(conf);
        SQLContext sqlContext = new SQLContext(sc.sc());
        ArrayList<String> names = new ArrayList<String>();
        names.add("刘亦菲");
        names.add("张柏芝");
        names.add("冯提模");
        names.add("陈一发儿");
        JavaRDD<String> nameRDD = sc.parallelize(names);
        JavaRDD<Row> nameRowRDD = nameRDD.map(new Function<String, Row>() {
            @Override
            public Row call(String line) throws Exception {
                return RowFactory.create(String.valueOf(line));
            }
        });
        /**
         * 使用动态编程方式,将RDD转换为Dataframe
         */
        ArrayList<StructField> fields = new ArrayList<StructField>();
        fields.add(DataTypes.createStructField("name", DataTypes.StringType, true));
        StructType structType = DataTypes.createStructType(fields);
        DataFrame nameDF = sqlContext.createDataFrame(nameRowRDD, structType);
        /**
         * 注册临时表
         */
        nameDF.registerTempTable("user");
        /**
         * 根据UDF函数参数的个数来决定是实现哪一个UDF  UDF1,UDF2, 表明包含几个参数传入
         * UDF1<String, Integer> 表示 传入参数 String 输出参数为 Integer
         * call方法为 自定义的函数!
         * DataTypes.IntegerType  必须与输出参数的类型一致即 Integer
         */
        sqlContext.udf().register("StrLen", new UDF1<String, Integer>() {
            @Override
            public Integer call(String s) throws Exception {
                return s.length();
            }
        }, DataTypes.IntegerType);
        /**
         * select name ,StrLen(name) as length from user
         * 在临时表user中 查找name   StrLen(name) == name的长度
         * StrLen(name) as length 表示将获取到的name的长度 例如15  15作为一列 as length 列名为 length
         */
        sqlContext.sql("select name ,StrLen(name) as length from user").show();
        Row[] rows = sqlContext.sql("select name ,StrLen(name) as length from user").collect();
        for (Row row : rows) {
            System.out.println(row);
        }


        sc.close();
    }
}
输出结果:同上!

Java版本中,主要之一到UDFX 方法,以及传入参数的个数类型,以及输出类型,最终要的是文本最后的
DataTypes.IntegerType  类型要与输出类型相同!





Spark中 UDF的使用 Spark提供了多种解决方案来应对复杂挑战, 但是我们面临了很多场景, 原生的函数不足以解决问题。因此,Spark允许我们注册自定义函数(User-Defined Functions, 或者叫 UDFs)。 SparkSQL中可以创建自定义函数UDF对dataframe进行操作,UDF是一对一的关系,用于给dataframe增加一列数据的场景。 每次传入一行数据,该行数据可以是一列,也可以是多列,进行一顿操作后,最终只能输出该新增列的一个值。 Spark支持多种语言,比如Python, Scala, Ja 阅读详情

相关推荐

Spark UDF开发指南:扩展SQL功能的正确姿势

UDF,即(用户自定义函数),是Spark SQL中一种允许用户自定义逻辑来处理数据的机制。它本质上是一个函数,接收零个或多个输入参数,并产生一个输出结果。UDF可以像Spark SQL内置函数一样,在selectfiltergroupBy等DataFrame/Dataset操作或SQL语句中使用。它使得用户能够将复杂的业务逻辑封装成一个函数,从而简化数据处理 pipeline 的代码。例如,我们可以定义一个UDF来计算字符串的长度(虽然Spark已有内置的length。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 726

Spark笔记之使用UDF(User Define Function)

Spark笔记之使用UDF(User Define Function) 目录 1、UDF介绍 2、使用UDF 2.1 在SQL语句中使用UDF 2.2 直接对列应用UDF(脱离sql) 3、完整代码 1、UDF介绍 UDF(User Define Function),即用户自定义函数,Spark的官方文档中没有对UDF做过多介绍,猜想可能是认为比较简单吧。 几乎所有sql数据库的实现都为用户提供了扩展接口来增强sql语句的处理能力,这些扩展称之为UDXXX,即用户定义(User Defin

helloxiaozhe的博客 8338

Spark UDF使用详解及代码示例

本文介绍如何在Spark Sql和DataFrame中使用UDF,如何利用UDF给一个表或者一个DataFrame根据需求添加几列,并给出了旧版(Spark1.x)和新版(Spark2.x)完整的代码示例。下面以Spark2.x为例给出代码,关于Spark1.x创建DataFrame可在最后的完整代码里查看。 2、Spark Sql用法...

主要分享大数据相关的知识,如Spark、Hudi 3万+

Spark UDF实例详解

Spark UDF实例详解 需求List: (1) 统计orders中produce的数量统计 – 商品被购买的数据量 hive : group by count spark: scala> val orders=sql(“select * from badou.orders”) scala> val products=sql(“select * from badou.products”) scala> val priors=sql(“select * from badou.priors”

hiscoming的博客 481

【毕设课设】基于YOLO v3与LSTM的水位智能识别系统(附完整源码+数据集)

本文详细介绍了基于YOLO v3与LSTM的水位智能识别系统的完整实现方案。该系统通过YOLO v3精准定位水位尺数字,结合LSTM-OCR进行序列识别,并融合霍夫变换检测刻度线,实现高精度水位自动读取。项目提供了从环境搭建、模型训练到集成部署的全流程指南,并附有完整源码和数据集,是理想的毕设课设实战项目。

php55的博客 611

Python实战:5分钟搞定N-CMAPSS航空发动机数据集解析(附完整代码)

本文提供了一份针对N-CMAPSS航空发动机数据集的快速解析实战指南。通过Python的h5py和Pandas库,详细演示了如何高效读取HDF5格式文件、理解数据结构、提取关键特征(如传感器数据与剩余使用寿命RUL),并整合为可用于预测性维护分析的DataFrame,帮助研究者和工程师快速上手这一重要的工业时序数据集。

weixin_29083373的博客 281

spark的UDF和UDAF用法

UDF(user defined function) UDF: 输入一行, 返回一个结果. 一对一关系 放入函数一个值, 就返回一个值, 而不会返回多个值. 如下面的例子就可以看出: (x: String) => "Name=" + x 这个函数, 入参为一个, 返回也是一个, 而不会返回多个值. 来个demo: In路径下的user.txt文件内容如下: {...

qq_44160357的博客 1860

告别死记硬背!用业务场景驱动理解SAP PS OPSA参数文件配置

本文通过制造业新产品研发项目案例,详细解析SAP PS模块中OPSA参数文件配置的实际应用。从项目立项、WBS分解到研发物料管理,系统讲解关键配置项的业务价值,帮助用户告别死记硬背,实现业务场景驱动的参数配置学习。特别适合制造业项目管理人员提升SAP PS配置效率。

weixin_30415113的博客 482

【Spark分布式内存计算框架——Spark SQL】13. 自定义UDF函数

无论Hive还是SparkSQL分析处理数据时,往往需要使用函数,SparkSQL模块本身自带很多实现公共功能的函数,在org.apache.spark.sql.functions中。SparkSQL与Hive一样支持定义函数:UDF和UDAF,尤其是UDF函数在实际项目中使用最为广泛。回顾Hive中自定义函数有三种类型:第一种:UDF(User-Defined-Function) 函数一对一的关系,输入一个值经过函数以后输出一个值;

优快云GuoYuying的博客 650

AutoSAR系列讲解(入门篇)2.2-SWC的类型

该章讲解了两种SWC的分类,并且映射到实际的工程中应该是具体的什么文件类型

雪云飞星的博客 4万+

Bootstrap方法详解——技术与实例

一、Introduction 如果说到Bootstrap你会想到什么?是Twitter推出的那个用于前端开发的开源工具包吗?Unfortunately,本文要讨论的并非是Bootstrap工具包,而是统计学习中一种重采样(Resampling)技术。这种看似简单的方法,对后来的很多技术都产生了深远的影响。机器学习中的Bagging,AdaBoost等方法其实都蕴含了Bootstrap的思想...

白马负金羁 8万+

Spark SQL函数定义

SQL函数分类可以分为UDF,UDAF,UDTF,本文介绍了spark原生自定义UDF函数,Pandas的UDF函数,基于Arrow完成Pandas DataFrame和Spark DataFrame互转,基于Pandas完成自定义UDF函数,UDAF函数

denglh525693的博客 1599

【YOLO11[基础]】分类任务的热力图可视化实践 | 论文必备 | 分类任务 | 即插即用 | 可选GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiR

【YOLO11[基础]】分类任务的热力图可视化实践 | 论文必备 | 分类任务 | 即插即用 | 可选GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiResCAM, LayerCAM, RandomCAM, EigenGradCAM等

静谧、淡雅 2389

sparkSQL的UDF,最常用的regeister方式自定义函数和udf注册方式定义UDF函数 (详细讲解)

使用最常用的regeister方式自定义函数最常用的方式,这种方式编写的函数,既能用于SQL中,也能用于DSL中# 编写一个普通的函数,用于写逻辑return list1[0] + "斤/" + list1[1] + "cm"

GDDGHS_的博客 1712

ESP32-IDF开发之旅 网络篇⑩ Web配网

本文介绍了基于ESP32S3的Web配网实现方案。作者通过移植开源项目,在ESP32S3上实现了WiFi配置功能,包括AP模式创建、HTTP服务器搭建、NVS存储读写等核心功能。文章详细解析了代码结构,包含WiFi初始化、事件处理、NVS存储管理和HTML页面服务等关键模块。实现方案采用AP+STA双模式,支持通过网页扫描WiFi并保存配置信息,适用于物联网设备的网络配置场景。代码中使用了FreeRTOS任务、ESP-IDF事件组等技术,并提供了完整的错误处理和日志记录功能。

单片机菜鸟哥的博客 352

RK3568平台开发系列讲解(NPU篇)什么是RKNPU

📢本篇章将介绍RKNPU。

内核笔记 4359

spark sql hive自定义函数(永久函数)

Spark(Hive) SQL中UDF的使用 相对于使用MapReduce或者Spark Application的方式进行数据分析,使用Hive SQL或Spark SQL能为我们省去不少的代码工作量,而Hive SQL或Spark SQL本身内置的各类UDF也为我们的数据处理提供了不少便利的工具,当这些内置的UDF不能满足于我们的需要时,Hive SQL或Spark SQL还为我们提供了自定义

6032

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

在 Spark SQL 中,如何通过 UDF(用户自定义函数)扩展 SQL 功能?

Spark SQL UDF 使用指南摘要: UDF(用户自定义函数)是扩展Spark SQL功能的核心方式,支持三种类型:普通UDF(行级转换)、UDAF(聚合函数)和UDTF(表生成函数)。本文详细介绍了从基础到高级的UDF实现方法,包括:1)字符串处理UDF的注册与使用(装饰器/直接注册);2)复杂数据类型(数组/JSON)处理;3)多参数UDF实现;4)SQL语句中调用UDF的技巧。通过实际代码示例演示了邮箱域名提取、年龄分组、销售额计算等典型场景,并提供了数组平均值计算、JSON解析等高级用法。最后

weixin_45422672的博客 473

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Spark SQL自定义函数

目录1 Spark SQL自定义函数1.1 自定义函数分类1.2 自定义UDF1.3 自定义UDAF2 开窗函数2.1、概述2.2.准备工作2.3. 聚合开窗函数2.4. 排序开窗函数2.4.1 ROW_NUMBER顺序排序2.4.2 RANK跳跃排序2.4.3 DENSE_RANK连续排序2.4.4 NTILE分组排名 1 Spark SQL自定义函数 1.1 自定义函数分类 类似于hive当中的自定义函数, spark同样可以使用自定义函数来实现新的功能。 spark中的自定义函数有如下3类 1.U

赵广陆 1863

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Spark SQL详解 | 目前Spark社区最活跃的组件之一

Spark SQL是一个用来处理结构化数据的Spark组件,前身是shark,但是shark过多的依赖于hive如采用hive的语法解析器、查询优化器等,制约了Spark各个组件之间的相互集成,因此Spark SQL应运而生。Spark SQL在汲取了shark诸多优势如内存列存储、兼容hive等基础上,做了重新的构造,因此也摆脱了对hive的依赖,但同时兼容hive。除了采取内存列存储优化性能,还引入了字节码生成技术、CBO和RBO对查询等进行动态评估获取最优逻辑计划、物理计划执行等。

智海观潮的博客 1380

Spark SQL 与 Spark DataFrame 自定义UDF、UDAF

UDF、UDAF、UDTF UDF:用户自定义函数(User Defined Function)。一行输入一行输出。 UDAF: 用户自定义聚合函数(User Defined Aggregate Function)。多行输入一行输出。 UDTF: 用户自定义表函数(User Defined Table Generating Function)。一行输入多行输出。如hive/spark中的expl...

王佩的优快云博客 4118

SparkSQL 最详细的Spark SQL(十五)

spark sql 一.概述1 spark历史2 Spark-SQL 概述2.1 特点2.2 作用2.3 Spark SQL架构图 3 Dataset演进历史3.1 RDD3.1.1 优点3.1.2 缺点 3.2 DataFrame3.2.1 优点3.2.2 缺...

weixin_45025143的博客 4487

day06_Spark SQL

分析函数 over(partition by xxx order by xxx [asc|desc] [rows between xxx and xxx])分析函数可以大致分成如下3类:1- 第一类: 聚合函数 sum() count() avg() max() min()2- 第二类: row_number() rank() dense_rank() ntile()3- 第三类: first_value() last_value() lead() lag()

AGI爱好者_数仓&可视化&数据分析工程师_Vae’伯乐‘ 1789

day07_Spark SQL

分析函数 over(partition by xxx order by xxx [asc|desc] [rows between xxx and xxx])分析函数可以大致分成如下3类:1- 第一类: 聚合函数 sum() count() avg() max() min()2- 第二类: 排序函数 row_number() rank() dense_rank()3- 第三类: 其他函数 ntile() first_value() last_value() lead() lag()

AGI爱好者_数仓&可视化&数据分析工程师_Vae’伯乐‘ 1785

【PySpark 学习笔记 五】SQL 协作:Spark SQL、临时视图、UDF

摘要 本文介绍了Spark SQL的核心功能与应用场景,通过城市销售日报案例对比DataFrame API与SQL的差异。主要内容包括: 双接口设计:Spark提供DataFrame API和SQL两种操作方式,底层共享Catalyst优化器,性能一致但适用场景不同。DataFrame适合复杂ETL,SQL便于临时查询。 技术实现:详细讲解临时视图、内置函数分类(字符串/日期/数学/聚合/窗口)和UDF性能优化(Pandas UDF比Python UDF更快)。 实践案例:从纯DataFrame实现逐步演变

MaoLin Tian's Blog 674
上一篇: Spark SQL 开窗函数row_number的使用
下一篇: Spark SQL UDF2的使用
JSON_ZJS
博客等级 码龄9年 30粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值