摸鱼大数据——Spark SQL——Spark SQL函数定义一

news2024/9/28 3:23:30

Spark SQL函数定义

1、窗口函数

回顾之前学习过的窗口函数:

 分析函数 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() 
 ​
 三个排序函数的区别?
 row_number(): 巧记 1234  特点: 唯一且连续
 rank(): 巧记 1224 特点: 并列不连续
 dense_rank(): 巧记 1223  特点: 并列且连续

在Spark SQL中使用窗口函数案例:

已知数据如下:

 cookie1,2018-04-10,1
 cookie1,2018-04-11,5
 cookie1,2018-04-12,7
 cookie1,2018-04-13,3
 cookie1,2018-04-14,2
 cookie1,2018-04-15,4
 cookie1,2018-04-16,4
 cookie2,2018-04-10,2
 cookie2,2018-04-11,3
 cookie2,2018-04-12,5
 cookie2,2018-04-13,6
 cookie2,2018-04-14,3
 cookie2,2018-04-15,9
 cookie2,2018-04-16,7

需求: 要求找出每个cookie中pv排在前3位的数据,也就是分组取TOPN问题

 # 导包
 import os
 from pyspark.sql import SparkSession,functions as F,Window as W
 ​
 # 绑定指定的python解释器
 os.environ['SPARK_HOME'] = '/export/server/spark'
 os.environ['PYSPARK_PYTHON'] = '/root/anaconda3/bin/python3'
 os.environ['PYSPARK_DRIVER_PYTHON'] = '/root/anaconda3/bin/python3'
 ​
 # 创建main函数
 if __name__ == '__main__':
     # 1.创建SparkContext对象
     spark = SparkSession.builder.appName('pyspark_demo').master('local[*]').getOrCreate()
 ​
     # 2.数据输入
     df = spark.read.csv(
         path='file:///export/data/spark_project/spark_sql/data/cookie.txt',
         sep=',',
         schema='cookie string,datestr string,pv int'
     )
     # 3.数据处理(切分,转换,分组聚合)
     # 4.数据输出
     etldf = df.dropDuplicates().dropna()
     # SQL方式
     etldf.createTempView('cookie_logs')
     spark.sql(
         """
         select cookie,datestr,pv
         from (
            select cookie,datestr,pv,
               dense_rank() over(partition by cookie order by pv desc) as rn
            from cookie_logs
         ) temp where rn <=3 
         """
     ).show()
     # DSL方式
     etldf.select(
         'cookie', 'datestr', 'pv',
         F.dense_rank().over( W.partitionBy('cookie').orderBy(F.desc('pv')) ).alias('rn')
     ).where('rn <=3').select('cookie', 'datestr', 'pv').show()
 ​
 ​
     # 5.关闭资源
     spark.stop()
 ​

运行结果截图:

2、自定义函数背景

2.1 回顾函数分类标准:

SQL函数,主要分为以下三大类:

  • UDF函数:普通函数

    • 特点:一对一,输入一个得到一个

    • 例如:split() ...

  • UDAF函数:聚合函数

    • 特点:多对一,输入多个得到一个

    • 例如:sum() avg() count() min() max() ...

  • UDTF函数:表生成函数

    • 特点:一对多,输入一个得到多个

    • 例如:explode() ...

在SQL中提供的所有的内置函数,都是属于以上三类中某一类函数

2.2 自定义函数背景

思考:有这么多的内置函数,为啥还需要自定义函数呢?

     为了扩充函数功能。在实际使用中,并不能保证所有的操作函数都已经提前的内置好了。很多基于业务处理的功能,其实并没有提供对应的函数,提供的函数更多是以公共功能函数。此时需要进行自定义,来扩充新的功能函数

在Spark SQL中,针对Python语言,对于自定义函数,原生支持的并不是特别好。目前原生仅支持自定义UDF函数,而无法自定义UDAF函数和UDTF函数。

在1.6版本后,Java 和scala语言支持自定义UDAF函数,但Python并不支持。

 1- SparkSQL原生的时候,Python只能开发UDF函数
 2- SparkSQL借助其他第三方组件(Arrow,pandas...),Python可以开发UDF、UDAF函数,同时也提升效率

Spark SQL原生UDF函数存在的问题:大量的序列化和反序列

     虽然Python支持自定义UDF函数,但是其效率并不是特别的高效。因为在使用的时候,传递一行处理一行,返回一行的方式。这样会带来非常大的序列化的开销的问题,导致原生UDF函数效率不好
     
 早期解决方案: 基于Java/Scala来编写自定义UDF函数,然后基于python调用即可
     
 目前主要的解决方案: 引入Arrow框架,可以基于内存来完成数据传输工作,可以大大的降低了序列化的开销,提供传输的效率,解决原生的问题。同时还可以基于pandas的自定义函数,利用pandas的函数优势完成各种处理操作

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

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

相关文章

Python酷库之旅-第三方库Pandas(011)

目录 一、用法精讲 25、pandas.HDFStore.get函数 25-1、语法 25-2、参数 25-3、功能 25-4、返回值 25-5、说明 25-6、用法 25-6-1、数据准备 25-6-2、代码示例 25-6-3、结果输出 26、pandas.HDFStore.select函数 26-1、语法 26-2、参数 26-3、功能 26-4、返回值…

3D模型格式转换工具HOOPS Exchange如何访问产品制造信息(PMI)?

在当今的制造和设计领域&#xff0c;产品制造信息&#xff08;PMI&#xff09;在确保零件和产品满足精确规格方面发挥着至关重要的作用。PMI&#xff0c;特别是几何尺寸和公差&#xff08;GD&T&#xff09;&#xff0c;提供了制造过程中必须遵循的详细指导。 随着技术的进…

centos7停服之后换阿里云的源

原因&#xff1a; Centos7停止维护 CentOS 7 官方支持在2024年6月30日结束。如果您正在使用CentOS 7&#xff0c;建议迁移到另一个仍在维护的Linux发行版&#xff0c;如CentOS Stream、AlmaLinux、Rocky Linux或者转换到使用Debian或Ubuntu。国产的华为的&#xff1a;openEule…

数据恢复篇:如何从硬盘中恢复照片

如何从计算机硬盘恢复图片&#xff1f; 和所有电子和机械设备一样&#xff0c;硬盘也可能因任何原因而损坏。如果您系统的硬盘停止工作&#xff0c;或者您在启动系统时听到振动声&#xff0c;则硬盘可能已损坏。如果是这样&#xff0c;硬盘上的数据怎么办&#xff1f; 不要惊…

Python开源工具库使用之离线翻译软件Argos-Translate

文章目录 一、软件介绍二、软件使用2.1 命令行使用2.2 Python代码调用2.3 GUI使用 三、软件获取 一、软件介绍 Argos-Translate 是一款基于 OpenNMT&#xff08;Open source Neural Machine Translation&#xff09;的离线翻译库&#xff0c;不需要联网就可以实现翻译功能&…

唐山养老院哪家好---养老!用哪种方式更合适?

人生旅途中&#xff0c;每个阶段都伴随着不同的挑战和难题。老年阶段尤其如此&#xff0c;随着岁月的流逝&#xff0c;人的身体机能逐渐衰退&#xff0c;自理能力也会随之减弱。面对这些挑战&#xff0c;老人及其家属需要找到合适的方法来保证老年的生活质量。 居家养老 在中…

7月学术会议:7月可投的EI国际会议

随着科技的迅猛发展&#xff0c;学术交流与研讨成为了推动科研进步的重要途径。进入7月&#xff0c;众多高质量的EI国际会议纷纷拉开帷幕&#xff0c;为全球的科研工作者提供了一个展示研究成果、交流学术思想的平台。以下&#xff0c;我们将详细介绍一些在7月可投的EI国际会议…

暑假提升(3)[平衡二叉树之二--红黑树]

命为志存。 —— 朱熹 红黑树RBTree 1、诞生原因2、红黑树的概念3、红黑树的性质4、红黑树的设计4、1、节点设计4、2、插入操作的设计 5、总结 1、诞生原因 由于二叉树的局限性&#xff0c;进一步出现平衡二叉树&#xff0c;来帮助我们来进一步提升我们对数据的处理&#xff0…

模电基础 - 信号的运算和处理

目录 一. 简介 二. 加法 三. 减法 四. 乘法 五. 除法 六. 总结 一. 简介 在模电基础中&#xff0c;信号的运算和处理是非常重要的内容。 信号的运算包括加法、减法、乘法、除法等。通过使用集成运放&#xff0c;可以很容易地实现这些运算。例如&#xff0c;利用反相输入…

【工具分享】I-Wanna-Get-All——主流OA漏洞检测利用工具

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 I-Wanna-Get-All安装方式功能介绍 GitHub项目地址&#xff1a;https://github.com/R4gd0ll/I-Wanna-G…

如何使用HTML和JavaScript读取文件夹中的所有图片并显示RGB范围

如何使用HTML和JavaScript读取文件夹中的所有图片并显示RGB范围 在这篇博客中&#xff0c;我将介绍如何使用HTML和JavaScript读取文件夹中的所有图片&#xff0c;并显示这些图片以及它们的RGB范围。这个项目使用现代浏览器提供的<input type"file" webkitdirecto…

生产力工具|Endnote X9如何自动更新文件信息

一、以EndNote X9.2版本为例&#xff0c;打开EndNote文献管理软件。 二、在菜单栏找到“Edit→Preferences...”&#xff0c;点击打开&#xff0c;弹出一个“EndNote Preferences”窗口。 三、进行设置 在打开的窗口左侧选择“PDF Handing”&#xff0c;右边会出现自动导入文献…

科普文:spring boot中常用的接口、工具栏、注解整理

1.springboot 常用接口 1.1 Aware接口 Spring IOC容器中 Bean是感知不到容器的存在&#xff0c;Aware(意识到的)接口就是帮助Bean感知到IOC容器的存在&#xff0c;即获取当前Bean对应的Spring的一些组件&#xff0c;如当前Bean对应的ApplicationContext等。 1.1.1 Applicati…

顶刊文献阅读及代码复现

前提:每个无人机都有 (i)自己的机载计算机,用于执行控制其自身动作所需的计算 (ii)自己的传感器系统,用于测量相对位置和速度, (iii)自己的通信设备,用于与相邻代理进行数据交换。 模型:短期的排斥力、中间范围的速度一致性和长距离的吸引力

开发工具 之十一 详解 OpenOCD 源码、构建、配合各仿真器使用示例

OpenOCD OpenOCD(Open On-Chip Debugger)是一个开源的跨平台的片上调试器,旨在提供针对嵌入式设备的调试、系统编程和边界扫描功能。其工作方式就是代替了原有那些调试适配器提供的相关工具和驱动, 直接通过普通的 USB 驱动访问适配器,进而访问目标硬件。 OpenOCD 是由 D…

【前端】使用chrom浏览器Network,查看前后台数据传输请求

使用chrom浏览器Network查看前后台数据传输请求 写在最前面查看前后台数据传输请求① 首先&#xff0c;打开开发者工具&#xff08;F12&#xff09;打开控制台&#xff0c;切换到Network面板。Network面板右键界面copy ②清空请求log ctrle两次或者点击clear图标 案例展示&…

MySQL日常运维手册

对象创建DDL查询 -- 获取创建 database 的 DDL show create database_name; -- 获取创建 表 的 DDL show create table table_name; -- 获取创建 视图 的 DDL show create view index_name; -- 获取创建 触发器 的 DDL show create trigger trigger_name; -- 获取创建 用…

软件架构之计算机网络

软件架构之计算机网络 第 4 章 计算机网络4.1 网络架构与协议4.1.1 网络互联模型4.1.2 常见的网络协议4.1.3 IPv6 4.2 局域网与广域网4.2.2 无线局域网4.2.3 广域网技术4.2.4 网络接入技术 4.3 网络互连与常用设备4.4 网络工程4.4.1 网络规划4.4.2 网络设计4.4.3 网络实施 4.5 …

分析逆向案例十——逗游网标准sha1加密

网址: aHR0cHM6Ly93d3cuZG95by5jbi9wYXNzcG9ydC9sb2dpbj9uZXh0PWh0dHBzOi8vd3d3LmRveW8uY24vZGFuamkvbGlzdA 分析登陆页面的加密。 返回了两个包&#xff0c;下面明显是登陆包&#xff0c;上面这个也是有用的&#xff0c;一般这种返回两个包的情况。前一个包返回的值一般是登…

JVM 调优常用命令

文章目录 前言JVM 调优常用命令1. JPS2. jmap3. jstat4. jstack5. jinfo6. 常用配置: 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实…