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

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的函数优势完成各种处理操作

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WEB06JavaScriptAjax

基础语法 引入方式 引入方式 内部脚本&#xff1a;将JS代码定义在HTML页面中 JavaScript代码必须位于<script></script>标签之间 在HTML文档中&#xff0c;可以在任意地方&#xff0c;放置任意数量的<script> 一般会把脚本置于<body>元素的底部&a…

搭建ASP+Mssql站点

SQL Server 2022 链接&#xff1a;https://pan.baidu.com/s/1U2zkXacbjOVNsAq-JQ80tA?pwdgosm 提取码&#xff1a;gosm MSSQLi-labs 链接&#xff1a;https://pan.baidu.com/s/1K6rCIaeSzaBBtQKD9Uk1fw?pwdveyn 提取码&#xff1a;veyn SQL Server 2022下载安装 安装成功…

使用 C# 训练大型语言模型和小型语言模型

介绍 训练大型语言模型 (LLM) 和小型语言模型 (SLM) 在人工智能和机器学习领域获得了巨大的关注。这些模型能够理解和生成类似人类的文本&#xff0c;具有从聊天机器人到高级数据分析的广泛应用。本文探讨了使用 C#&#xff08;一种在企业环境中广泛使用的面向对象编程语言&am…

发那科机床联网串口配置

本文章仅针对无网口&#xff0c;需要通过串口输出采集数据情况。跟这篇文章互为参考&#xff0c;一个理论&#xff0c;一个实战。 Fanuc DPRNT宏程序串口采集-CSDN博客 一、禁用机器串口监控 选择System、monit 二、设置参数可写 在MDI模式中字符面板上按OFS/SET键,连按致屏…

基于门控循环单元 GRU 实现股票单变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

Java巅峰之路---基础篇---面向对象

目录 面向对象介绍 什么是面向对象编程&#xff1f; 为什么用面向对象编程&#xff1f; 面向对象的重点学习什么&#xff1f; 类和对象 介绍 类的定义 构造方法 作用 格式和特点、执行时机 构造方法注意事项 标准的JavaBean类 定义类的补充注意事项 封装 什么是封…

水的过滤方式介绍

RO反渗透程序设计软件下载 超滤(UF)&#xff1a; 过滤精度在0.001-0.1微米&#xff0c;属于二十一世纪高新技术之一。是一种利用压差的膜法分离技术&#xff0c;可滤除水中的铁锈、泥沙、悬浮物、胶体、细菌、大分子有机物等有害物质&#xff0c;并能保留对人体有益的一些矿物质…

音频demo:使用fdk-aac将PCM数据编码成aac数据

1、README a. 编译 编译demo 本demo是使用的开源项目fdk-aac将PCM数据编码成aac音频文件。由于提供的.a静态库是在x86_64的机器上编译的&#xff0c;所以默认情况下仅支持该架构的主机上编译运行。 $ make编译fdk-aac&#xff08;可选&#xff09; 如果想要在其他架构的CP…

【笔记】finalshell中使用nano编辑器GNU

ctrl O 保存 enter 确定 ctrl X 退出 nano编辑 能不用就不用吧 因为我真用不习惯 nano编辑的文件也可以用vim编辑的

VsCode崩溃无法打开解决办法

今天打开电脑 点开vscode突然不能使用了 每次点开都闪退,于是查找解决办法 直接重启电脑 这个方法没有解决问题 删除软件 重新安装软件 软件删干净之前保存下自己的配置文件 比如扩展和settings.json和keybinding.json Mac系统 在 /Users/用户名/.vscode/extensions 和/User…

2024年 春秋杯 网络安全联赛夏季赛 Web方向 题解WirteUp 部分

brother 题目描述&#xff1a;web哥&#xff0c;打点容易提权难。 打点就是最简单的SSTI。 执行下find / -user root -perm -4000 -print 2>/dev/null找一下具备suid权限的命令 /usr/lib/dbus-1.0/dbus-daemon-launch-helper /usr/bin/chsh /usr/bin/gpasswd /usr/bin/n…

Java-链表反转

题目&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 图示&#xff1a; 输入&#xff1a; head [1,2,3,4,5] 输出&#xff1a; [5,4,3,2,1] 解题思路&#xff1a; 情况一&#xff1a; 只有一个节点或者没有节点 …

C语言 | Leetcode C语言题解之第224题基本计算器

题目&#xff1a; 题解&#xff1a; int calculate(char* s) {int n strlen(s);int ops[n], top 0;int sign 1;ops[top] sign;int ret 0;int i 0;while (i < n) {if (s[i] ) {i;} else if (s[i] ) {sign ops[top - 1];i;} else if (s[i] -) {sign -ops[top - 1…

Python | Leetcode Python题解之第223题矩形面积

题目&#xff1a; 题解&#xff1a; class Solution:def computeArea(self, ax1: int, ay1: int, ax2: int, ay2: int, bx1: int, by1: int, bx2: int, by2: int) -> int:area1 (ax2 - ax1) * (ay2 - ay1)area2 (bx2 - bx1) * (by2 - by1)overlapWidth min(ax2, bx2) - …

挑战杯 opencv python 深度学习垃圾图像分类系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; opencv python 深度学习垃圾分类系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 这是一个较为新颖的竞…

如何把harmonos项目修改为openharmony项目

一开始分不清harmonyos和openharmony&#xff0c;在harmonyos直接下载的开发软件&#xff0c;后面发现不对劲&#xff0c;打脑阔 首先你要安装对应版本的开发软件&#xff0c;鸿蒙开发是由harmonyos和openharmony官网两个的&#xff0c;找到对应的地方下载对应版本的开发软件&…

【链表】- 链表相交

1. 对应力扣题目连接 链表相交 2. 实现思路 链表详情&#xff1a; 考虑使用双指针&#xff1a; 解法一&#xff1a; 具体代码&#xff0c;详见3. 实现案例代码解析&#xff1a; 思路&#xff1a;因为链表按照如图的箭头走向&#xff0c;走的总路程是相等的&#xff0c;一…

数字交流便携式电阻式三相负载组

三相型号选项范围从小型、便携式、低功耗单元到大功率、室内和室外永久电阻负载组。型号标配按钮式手动控制以及 PC 软件控制&#xff0c;为处理复杂的测试应用提供先进的负载曲线解决方案。这些装置适用于各种用途&#xff0c;包括测试发电机、UPS 系统、数据中心电源系统、电…

自定义类TMyLabel继承自QLabel ,实现mouseDoubleClickEvent

自定义类TMyLabel &#xff0c;继承自QLabel TMyLabel 中重新实现了 event 方法&#xff0c;重写了mouseDoubleClickEvent 发射信号 在主窗体中放入TMyLabel组件&#xff0c;将TMyLabel mouseDoubleClickEvent 信号&#xff0c; 绑定到实现方法do_doubleClick()槽函数 TMy…

排序算法(算法篇)

算法之排序算法 排序算法 概念&#xff1a; 我们在的排序工作能在主存中完成的&#xff0c;我们就叫这种算法叫做内部排序不能在主存中完成而必须在磁盘或磁带上完成的排序算法叫做外部排序 冒泡排序 概念&#xff1a; 冒泡排序是一个很简单的排序算法&#xff0c;冒泡排…