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

- UDF:一对一的函数【User Defined Functions】
  - substr、split、concat、instr、length、from_unixtime
- UDAF:多对一的函数【User Defined Aggregation Functions】 聚合函数
  - count、sum、max、min、avg、collect_set/list
- UDTF:一对多的函数【User Defined Tabular Functions】
  - explode、json_tuple【解析JSON格式】、parse_url_tuple【解析URL函数】

Spark中支持UDF和UDAF两种,支持直接使用Hive中的UDF、UDAF、UDTF.

pyspark中自定义函数的三种写法:

使用最常用的regeister方式自定义函数 

 最常用的方式,这种方式编写的函数,既能用于SQL中,也能用于DSL中

语法:

UDF变量名 = spark.udf.register(UDF函数名, 函数的处理逻辑)

定义:spark.udf.register()
UDF变量名:DSL中调用UDF使用的
UDF函数名:SQL中调用UDF使用

案例:

查看以下数据

id    name    msg
01    周杰伦    150/175
02    周杰    130/185
03    周华健    148/178
04    周星驰    130/175
05    闫妮    110/180

将以上数据,通过自定义函数,变为如下数据:
01    周杰伦     150斤/175cm
02    周杰      130斤/185cm
03    周华健  148斤/178cm

 

第一步 :自定义函数 

# 编写一个普通的函数,用于写逻辑
def get_data(str1):
    list1 = str1.split("/")
    return list1[0] + "斤/" + list1[1] + "cm" 

 第二步:注册函数

# 定义一个UDF:变量名-dsl = spark.udf.register(函数名-sql, 处理逻辑, 返回值)
    # get_new_info 用于 sql 中
    # get_info 用于DSL
    get_info = spark.udf.register(name="get_new_info", f=lambda oldinfo: get_data(oldinfo))

第三步:使用函数

#使用sql的方式调用
    spark.sql("select id,name,get_new_info(msg) from star").show()

    # 使用dsl的方式调用
    # DSL:用变量名
    import pyspark.sql.functions as F

    new_df.select(F.col("id"), F.col("name"), F.col("msg"), get_info(F.col("msg")).alias("newinfo")).show()

代码演示 以及解释

import osfrom pyspark.sql import SparkSessionimport pyspark.sql.functions as F
if __name__ == '__main__':# 配置环境os.environ['JAVA_HOME'] = 'D:/java/jdk'# 配置Hadoop的路径,就是前面解压的那个路径os.environ['HADOOP_HOME'] = 'D:/hadoop3.3.1/hadoop-3.3.1'# 配置base环境Python解析器的路径os.environ['PYSPARK_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'  # 配置base环境Python解析器的路径os.environ['PYSPARK_DRIVER_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'spark = SparkSession.builder.master("local[2]").appName("").config("spark.sql.shuffle.partitions", 2).getOrCreate()# 第一种方案# format("csv") 是读取文件格式,后面是文件路径  toDF("id","name","msg")是把文件里面的数据源变成指定的字段df = spark.read.format("csv").option("sep", "\t").load("../../datas/function/udf.txt").toDF("id", "name","msg") df.createOrReplaceTempView("t") #给数据源起个名字# 编写sqlspark.sql("""select id,name,concat(split(msg,"/")[0],'斤/',split(msg,"/")[1],'cm')msg from t   """).show()# 第二种方案 自定义函数#第一步 定义函数def my_function(msg):return msg.split("/")[0] + "斤/" + msg.split("/")[1] + "cm"# 第二步注册函数my_function2 = spark.udf.register("my_function",my_function)# 第三步调用函数spark.sql("""select id,name,my_function(msg) msg from t""").show()# 自定义函数DSL使用 registerdf.select(F.col("id"),F.col("name"),my_function2(F.col("msg"))).show()spark.stop()

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/5022.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

[SAP ABAP] 面向对象程序设计-类和对象

面向对象开发的特点:封装、继承和多态 什么是类和对象? 类(CLASS)是创建对象的模板,对象(OBJECT)是类的实例 一个类可以创建多个对象 类 > 类型 对象 > 个体 在ABAP语言中,定义一个类,需要包含定义(defin…

需求不明确时如何设计测试用例?

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、与产品澄清问题 需求不明确时,首先,应弄明白,需求有哪些模块及功能算法不明确? 需求有问题找相关负责人沟通…

C++:多态中的虚/纯虚函数,抽象类以及虚函数表

我们在平时,旅游或者是坐高铁或火车的时候。对学生票,军人票,普通票这些概念多少都有些许耳闻。而我们上篇文章也介绍过了继承与多继承。如果这些票我们都分别的去写一个类,当然很冗余,这里我们便可以去使用继承&#…

Sun Solaris开机自启配置

Sun Solaris 开机自启配置 1. 运行级别定义(rc0.d — rcS.d) Linux/Solaris系统启动相关目录、脚本说明: init: 系统启动超级进程inittab: 进程启动配置init.d: 启动脚本存放目录rc0---rc6: 运行级别目录rcS: 单用户模式启动脚本 Linux/S…

机器学习—例子:图像识别

在上篇文章中,在一个需求预测示例中看到了神经网络是如何工作的,那么如何将类似类型的想法应用于计算机视觉应用程序。 如果你正在开发人脸识别应用程序,让我们深入研究一下。假设一个神经网络将这样的图片作为输入,并输出图片中…

微服务系列五:避免雪崩问题的限流、隔离、熔断措施

目录 实验环境说明 前言 一、一片小雪花引起的雪崩! 1.1 雪崩问题(级联失败问题)示意图 1.2 雪崩问题的产生原因与解决策略 二、雪崩问题的具体解决策略 2.1 请求限流 2.2 线程隔离 2.3 服务熔断 2.4 总结——具体解决策略 三、微…

C语言之写一个修改数组内容的函数

问题代码: 函数ltrim是为了消除buf字符数组中左边空格, memmove函数介绍 如果对c语言指针运用非常熟练的人,结合函数功能就会发现这个代码非常的傻逼,你会发现为什么需要返回,buf不用接收返回值,执行这个函数后buf中的内容就已经…

第二十七章 Vue异步更新之$nextTick

目录 一、概述 二、完整代码 2.1. main.js 2.2. App.vue 一、概述 需求:编辑标题, 弹出显示编辑框自动聚焦 1. 点击编辑,显示编辑框 2. 让编辑框,立刻获取焦点 我们常规的思路可能会编写如下代码来实现: 问题&#xff1a…

【含文档】基于ssm+jsp的IT论坛系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: apache tomcat 主要技术: Java,Spring,SpringMvc,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定义了三个…

【运维心得】按任何键都不能进BIOS三步解决

目录 第一步 键盘 第二步 工具 第三步 短路 估计经常搞运维的朋友,会经常碰到这个问题。 第一步 键盘 这个现象出现,首先要确定开机时,屏幕上是否会显示提示字符?比如F2、F10、DEL键之类的,如果有,那么就…

OpenCV基础05_GUI和PyMsql

目录 一、PySimpleGUI 1、布局和窗口 2、文本框组件 3、视频处理 4、图片处理 二、pymsql 1、数据库操作 2、数据采集 3、人脸识别 一、PySimpleGUI PySimpleGUI 是一个用于简化 GUI 编程的 Python 包,它封装了多种底层 GUI 框架(如 tkinter、…

动态代理IP的应用场景有哪些?

在数字化时代,数据的价值不言而喻,而动态代理IP则如同企业数据采集的隐形翅膀,助力企业在信息海洋中翱翔。本文将深入探讨动态代理IP的应用场景,揭示其如何帮助企业提升业务成功率,保障数据采集的安全性与稳定性。 动…

从实验室到晶圆厂:光刻胶剥离液的关键转变

根据QYResearch调研团队最新发布的《全球光刻胶剥离液市场报告2023-2029》显示,预计到2029年,全球光刻胶剥离液市场规模将攀升至15.8亿美元,未来几年将以8.9%的复合年增长率(CAGR)持续增长。 上述图表及数据均来源于QY…

基本开关电源电路分析

一、BOOST电路(升压): 下图为Boost电路的最基本拓扑,从左至右包括电源,储能电感L1,开关管Q1,二极管D1,输出滤波电容C1及负载电阻R1。 工作原理: 开关管导通状态&#xf…

【解决】Pico 串流 Unity 开发环境 Preview 黑屏问题

开发平台:Unity 6.0 开发工具:Pico SDK   一、问题描述 在 Unity 开发环境下运行 测试 PicoVR 表现时,出现 Game视窗 PicoVR投屏 呈现黑屏效果。详细背景如下: UnitySwitch PlateformPICO Integration SDKPICO Live Preview6…

网站域名注册流程详解

随着互联网的普及,网站已经成为人们获取信息、传播观点和开展业务的重要途径。在创建自己的网站之前,第一步是选择并注册一个合适的域名。域名是您网站的地址,它将帮助用户找到您的在线空间。在这篇文章中,我们将详细介绍网站域名…

AI赋能人才管理:东软助力企业数字化转型

在数字化转型大潮席卷全球的今天,如何在新时代背景下实现高效、智能的管理升级,也成为了广大企业关注的焦点。 不久前,东软正式发布TalentBase数智人力资本管理产品,以AI人才管理模式为企业人力资源管理注入了新的活力。 数字化转…

专治拖延症❗❗提升学习效率的秘密武器⏰【当当狸智能时间管理器D2】养成高效自律好习惯

孩子有拖延的习惯,做事磨蹭拖拉,学习效率底下❓ 尤其是低年龄段的孩子时间观念不强, 所以就很懒散很被动,做事的效率也很低 缺乏时间管理能力的孩子可能会 面临学业压力增大、成绩下滑、情绪消极等后果❌ 所以,一…

Python字符串(一图秒了)

一、概念 在Python中用单引号或双引号引起来的内容 定义 s abc123 s "abc" s #空字符串 s "" #空字符串 s #空格字符串 s " " #空格字符串 注意:空格字符串不是空字符串 二、字符串的访问&…

Linux权限管理和文件属性

目录 1. 权限的概念 2. 权限管理 2.1 文件访问者的分类 2.2 文件类型和访问权限(事物属性) 2.2.1 文件类型 2.2.2 file指令 2.2.3 基本权限 3. 文件访问权限的相关设置方法 3.1 chmod 3.2 chown 和 chgrp 3.3 umask 4. 粘滞位 1. 权限的…