spark 编程案例

综合案例

以下案例结合了spark sql、dataframe、udf、读写文件等操作

# encoding:utf8
from pyspark.sql import SparkSession 
from pyspark.sql import functions as F#需求1:各省销售额的统计
#需求2:T0P3销售省份中,有多少店铺达到过日销售额1000+
#需求3:T0P3省份中,各省的平均单单价
#需求4:T0P3省份中,各个省份的支付类型比例
#receivable:订单金额
#storeProvince:店铺省份
#dateTs:订单的销售日期
#payType:支付类型
#storeID:店铺ID
if __name__ == '__main__':spark = SparkSession.builder.\appName("SparkSQL ExampLe").\master("local[*]").\config("spark.sql.shuffle.partitions","2").\ #local模式下调整为2config("spark.sql.warehouse.dir","hdfs://node1:8020/user/hive/warehouse").\ #hdfs配置config("hive.metastore.uris","thrift://node3:9083").\ # metastore配置,配置spark on hiveenableHiveSupport().\getorCreate()#1.读取数据#省份信息,缺失值过滤,同时省份信息中会有”nu1”字符串#订单的金额,数据集中有的订单的金额是单笔超过10800的,这些是测试数#列值剪(SparkSQL会自动做这个优化)df = spark.read.format("json").load("../../data/input/mini.json").\dropna(thresh=1, subset=['storeProvince']).\filter("storeProvince != 'null'").\filter("receivable 10000").\select("storeProvince","storeID","receivable","dateTs","payType") # 筛选必须数据#T0D0需求1:各省销售额统计province_sale_df = df.groupBy("storeProvince").sum("receivable").\withColumnRenamed("sum(receivable)", "money").\ # sum求和后,新生成的列名默认为聚合函数名和操作的列名,此处重命名withColumn("money", F.round("money",2)).\ # round四舍五入orderBy ("money",ascending=False)province_sale_df.show(truncate=False)#写出MySQLprovince_sale_df.write.mode("overwrite").\format("jdbc").\option("url","jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&characterEncoding=utf8").\option("dbtable","province_sale").\option("user","root").\option("password","2212072ok1").\option("encoding","utf-8").\save()#写出Hive表saveAsTable可以写出表要求已经配置好Spark On Hive,配置好后#会将表写入到HiVe的数据仓库中province_sale_df.write.mode ("overwrite").saveAsTable ("default.province_sale","parquet")#T000需求2:T0P3销售省份中,有多少店铺达到过日销售额1000+#2.1先找到T0P3的销售省份top3_province_df = province_sale_df.limit(3).select("storeProvince").withColumnRenamed("storeProvince","top3_storeProvince") #这里需要对top3的stroprovince列重命名,否则下面groupby会有问题#2.2和原始的DF进行内关联,数据关联后,就是全部都是T0P3省份的销售数据了top3_province_df_joined = df.join(top3_province_df, on = df['storeProvince'] == top3_province_df['top3_province'])top3_province_df_joined.persist(StorageLevel.MEMORY_AND_DISK)#广东省1 2021-01-03 1005#广东省2#广东省3·#湖南省1.#湖南省2。#广东省33#湖南省123#from_unixtime的精度是秒级,数据的精度是毫秒级,要对数据进行精度的裁剪province_hot_store_count_df = top3_province_df_joined.groupBy("storeProvince","storeID"F.from_unixtime(df['dateTs']sbstr(0,10),"yyyy-MM-dd").alias("day")).\ sum("receivable").withColumnRenamed("sum(receivable)","money").\ #这里withColumnRenamed和上面alias都是重命名,只不过alias返回column对象,withColumnRenamed返回dffilter("money > 1000").\dropDuplicates(subset=["storeID"]).\groupBy("storeProvince").count()province_hot_store_count_df.show()#写出MySQLprovince_hot_store_count_df.write.mode("overwrite").\format("jdbc").\option("url","jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&characterEncoding=utf8").\option("dbtable","province_hot_store_count").\option("user","root").\option("password","22120720k1").\option("encoding","utf-8").\save()#写出Hiveprovince_hot_store_count_df.write.mode("overwrite").saveAsTable("default.province_hot_store_count","parquet")#T0D0需求3:T0P3省份中各个省份的平均订单价格(单单价)top3_province_order_avg_df = top3_province_df_joined.groupBy("storeProvince").\avg("receivable").\withColumnRenamed("avg(receivable)","money").\withColumn("money",F.round("money",2)).\orderBy("money",ascending=False)top3_province_order_avg_df.show(truncate=False)#T0D0需求4:T0P3省份中,各个省份的支付比例#湖南省支付宝33%#湖南省现金36%#广东省微信33%top3_province_df_joined.createTempView("province_pay")# 由于spark中没有将数字转换为含百分号的字符串函数,定义udf实现def udf_func(percent):return str(round(percent 100,2))+"%"#注册UDFmy_udf = F.udf(udf_func,StringType())# 下面group by的total和storeProvince作用相同,只是为了语法正确加上,在 SELECT 列表中,除了聚合函数外,所有列都必须在 GROUP BY 子句中明确指定。否则,大多数数据库系统会抛出错误pay_type_df spark.sql("""SELECT storeProvince,payType, (COUNT(payType) / total) AS percent FROM(SELECT storeProvince,payType,count(1)OVER(PARTITION BY storeProvince)AS total FROM province_pay)AS subGROUP BY storeProvince,payType,total""").withColumn("percent",my_udf("percent"))top3_province_df_joined.unpersist()

上面案例中,为什么 GROUP BY 需要包含 total 列:

语义一致性:在 SELECT 子句中,你使用了 COUNT(payType) / total 来计算百分比。由于 total 是通过窗口函数计算得出的,并且不是直接通过 GROUP BY 子句中的列聚合得到的,为了让查询的语义更加明确和一致,最好将 total 列也包含在 GROUP BY 子句中。这样,数据库知道如何根据 storeProvince、payType 和 total 的每个唯一组合来分组结果,并计算相应的 COUNT(payType)。避免错误:如果不包含 total 在 GROUP BY 子句中,某些数据库系统可能会抛出错误,因为它们无法确定如何在没有显式分组的情况下处理这个非聚合列。即使某些数据库系统允许这样做(例如,通过假设 total 对于每个 storeProvince 和 payType 组合都是相同的),这也是一个不安全的做法,因为它可能导致逻辑错误或不可预测的结果。逻辑准确性:在计算百分比时,确保每个 storeProvince 和 payType 组合都与其对应的 total 值匹配是非常重要的。通过将 total 列包含在 GROUP BY 子句中,你确保了这个匹配是精确的。

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

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

相关文章

2024.2.18力扣每日一题——N叉树的前序遍历

2024.2.18 题目来源我的题解方法一 深度优先遍历(递归方式)方法二 迭代方式(栈实现) 题目来源 力扣每日一题;题序:589 我的题解 方法一 深度优先遍历(递归方式) 与二叉树的前序遍…

C++刷题篇——04找等值元素

一、题目 二、解题思路 1、分割后放进二维数组 2、使用map,key为数值,value为其坐标 3、遍历二维数组元素,再在map中找该元素对应的value值(二维数组形式),倘若value.size为1,那直接返回-1&…

【学习革命】主动学习:打破传统,解锁高效学习新密码

主动学习:探索高效学习方法,提升自我知识与技能 1. 主动学习的定义与重要性 主动学习是指学习者主动参与到学习过程中,通过探索、发现、思考、实践等手段,以提高自己的知识与技能。与被动学习相比,主动学习更强调学习…

2024阿里云服务器ECS u1实例性能测评_CPU内存_网络_存储

阿里云服务器u1是通用算力型云服务器,CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器,ECS通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xf…

PostgreSql 01 安装,创建用户,创建数据库,创建关系

01.安装postgresql postgreSql 是在linux上 去官网找按照的方式 选择好postgreSql 的版本,已经Linux的发行版本 拿到命令,直接扔到Linux中运行即可 # 下载PGSQL的rpm包 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpm…

如何一键展示全平台信息?Python手把手教你搭建自己的自媒体展示平台

前言 灵感源于之前写过的Github中Readme.md中可以插入自己的js图片和动态api解析模块&#xff0c;在展示方面十分的美观&#xff1a; 这方面原理可以简化为&#xff0c;在Markdown中&#xff0c;你可以使用HTML标签来添加图像&#xff0c;就像这样&#xff1a; <tr><…

低噪声、轨至轨运算放大器芯片—— D721、D722、D724,适合用于音频领域

应用领域 D721、D722、D724是我们推荐的三款低噪声、轨至轨运算放大器芯片&#xff0c;其中D721为单运放&#xff0c;D722为双运放&#xff0c;D724为四运放。适合用于音频领域、传感器等的信号放大处理&#xff0c;比如K歌宝、音响、测距、滤波器、AD转换器前级信号处理等等。…

设计模式 - Provider 模式

在某些情况下&#xff0c;我们希望为应用程序中的许多&#xff08;如果不是全部&#xff09;组件提供数据。尽管我们可以使用 props 将数据传递给组件&#xff0c;但如果应用程序中的几乎所有组件都需要访问 prop 的值&#xff0c;这可能很难做到。 我们经常遇到所谓的属性钻探…

【Kotlin】Sequence简介

1 前言 序列&#xff08;Sequence&#xff09;是 Kotlin 中为方便操作集合及其元素而定制的接口&#xff0c;是一个延迟获取数据的集合&#xff0c;只有需要元素时才会生产元素。在处理大量数据时&#xff0c;序列可以显著地提升性能。 Sequence 类似 Java 中的 Stream&#xf…

亚信安慧AntDB:激荡数据浪潮,塑造智能新纪元

亚信安慧AntDB一直秉承着“技术生态”的理念&#xff0c;不断进行技术创新和功能增强&#xff0c;以保持与先进数据库系统的竞争力。作为一款致力于提升数据库处理性能和稳定性的系统&#xff0c;AntDB在技术上始终保持敏锐的洞察力&#xff0c;不断汲取国内外先进技术的精华&a…

大模型之路2:继续趟一条小路

继续趟一条小路&#xff0c;可谓是充满了曲折&#xff0c;当然&#xff0c;必不可少的还是坑。 吐槽 看过的喷友&#xff0c;其实你看完以后&#xff0c;大概率也就是和我一起骂骂街&#xff0c;因为....我也的确没理清楚。 我也不知道做错了什么&#xff0c;就是运行不过去…

达梦数据库日志文件管理

达梦数据库日志文件管理 联机重做日志管理归档日志文件管理开启归档模式&#xff1a;SQL开启归档模式&#xff1a;dmarch.ini归档文件切换和删除 联机重做日志管理 检查联机重做日志&#xff1a; select * from v$rlog; --CUR_FILE表示正在使用的日志文件编号select * fr…

【讲解下Gitea】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

实验二 数据库安全性技术(8.0)

实验二 数据库安全性技术&#xff08;8.0&#xff09; 制作不易&#xff01;点个关注&#xff01;给大家带来更多的价值&#xff01; 目录 实验二 数据库安全性技术&#xff08;8.0&#xff09;**制作不易&#xff01;点个关注&#xff01;给大家带来更多的价值&#xff01;**…

使用plasmo开发浏览器插件在网页指定位置添加自定义UI

使用plasmo开发浏览器插件的时候&#xff0c;有时候需要在指定网站的指定页面添加自定义的UI内容&#xff0c;如果通过content.js内容脚本去通过js创建的话&#xff0c;可就太麻烦了&#xff0c;要写不少的js代码。不过plasmo已经帮我们实现了这个功能&#xff0c;就是Content …

WRF vortex-following 设置

WRF&#xff08;Weather Research and Forecasting&#xff09;是一种用于天气和气候模拟的开源模型。在WRF中选择使用vortex-following方法进行模拟时&#xff0c;主要是为了更准确地捕捉气旋&#xff08;vortex&#xff09;的演变和特征。以下是详细的流程描述以及相关的name…

abc-347

title: abc 347 date: 2024-04-01 01:57:25 tags: 比赛 categories: 赛后思考与总结 A 思路 能够被整除的就输出 代码 void solve() {int n,k;cin >> n >> k;vector<int> vec;for(int i 1; i < n ; i ){int x; cin >> x;if(x % k 0) vec.push_…

【CAD建模号】学习笔记(一)

一、概述 CAD建模号是一款用于在智能手机及平板电脑等移动设备上进行三维建模的app&#xff0c;最初发布于2019年。 二、基本操作 手指直接点按&#xff0c;拖动来粗略创建和操作对象&#xff1b;双指缩放视图&#xff0c;双指移动视图。手指长按屏幕&#xff0c;出现红色小…

css-盒子阴影

1.box-shadow: 10px 20px 10px 10px blue; 参数对应顺序&#xff1a;上下&#xff0c;左右 &#xff0c;模糊程度&#xff0c;颜色 &#xff0c;阴影大小 2.box-shadow: 10px 20px 10px 20px blue,-10px -20px 10px 50px red; 负号就是相反方向 支持多个阴影 在后面加逗号 3…

汽车充电桩主板购买渠道汇总

随着充电桩设施的迅速普及&#xff0c;充电桩作为其中关键组件之一&#xff0c;市场需求不断增长。在互联网科技飞速发展的背景下&#xff0c;充电桩主板的采购渠道更加多元化&#xff0c;下面我们来探讨消费者、充电桩运营商和生产商可以从何处购买充电桩主板。 直接联系制造商…