SparkSQL实践

简介: SparkSQL实战:统计用户及商品数据指标,包含以下三张表

SparkSQL实战:统计用户及商品数据指标,包含以下三张表


orders表:

image.png

product表:

image.png

prior表:

image.png

实现以下业务需求:

image.png


1.统计product被购买的数量:

val productCnt = priors.groupBy("product_id").count()

2..统计product 被reordered的数量(再次购买)

product_id做group by(聚合),统计一下sum(reorder)的值
1)priors
.selectExpr("product_id","cast(reordered as int)")
.filter(col("reordered")===1)
.groupBy("product_id")
.count()
2)priors.selectExpr("product_id","cast(reordered as int)")
.groupBy("product_id").sum("reordered")
3)priors.selectExpr("product_id","cast(reordered as int)")
.groupBy("product_id").agg(sum("reordered"),avg("reordered"))


(agg一般是搭配groupby这种聚合函数使用和单独使用sum的差别,是在一次聚合中可以统计出来多个值)


3.结合上面数量统计product购买的reordered 的比率avg("reordered")

sql解决:jproduct.selectExpr("*","sum_re/count as mean_re")


udf解决:


join操作:


productCnt:为上面计算好的count


val jproduct = productCnt.join(prodcutSumReorder,"product_id")

image.png

使用udf:1.导包

image.png


2定义udf:.val avg_udf = udf((sm:Long,cnt:Long)=>sm.toDouble/cnt.toDouble)


3.使用udf:

image.png

user 统计/特征

1.每个用户平均购买订单的间隔周期

1)解决用户的第一个订单没有间隔天数的,需要赋值为0


val ordersNew =orders.selectExpr("*","if(days_since_prior_order='',0,days_since_prior_order) as dspo")
.drop("days_since_prior_order").show()
(drop:丢掉其中的一列)


2)最终代码:


ordersNew.selectExpr("user_id","cast(dspo as int)")
.groupBy("user_id").avg("dspo").show()

2.每个用户的总订单数量

orders.groupBy("user_id").count().show()

3.每个用户购买的product商品去重后的集合数据

1.)先求每个用户和product:

image.png

val po = orders.join(priors,"order_id").select("user_id","product_id").show(5)


2)对每个用户对product求和:


DataFrame转RDD处理:

val rddRecords=op.rdd.map(x=>(x(0).toString,x(1).toString))

.groupByKey()

.mapValues(_.toSet.mkString(","))


取出一条数据的结果:

image.png

3)隐式转换:


3.1导包:import spark.implicits._


3.2代码:rddRecords.toDF("user_id","product_records")


结果:

image.png

4.每个用户总商品数量以及去重后的商品数量

总商品数量:

orders.join(priors,"order_id").groupBy("user_id").count().show(5)


解法1:统计去重商品的数量:

image.png

结果:

image.png

解法2:

image.png


5.每个用户购买的平均每个订单的商品数量

1)先求每个订单的商品数量【对订单做聚合count()】

val ordProCnt = priors.groupBy("order_id").count()


2)求每个用户订单中商品个数的平均值【对user做聚合,avg(商品个数)】

orders.join(ordProCnt,"order_id").groupBy("user_id").avg("count")

(count出来的列名就叫count)


目录
相关文章
|
存储 资源调度 运维
【FusionCompute】介绍(一)
【FusionCompute】介绍(一)
1222 0
【FusionCompute】介绍(一)
|
关系型数据库 MySQL
mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file
mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file
1248 0
|
10月前
|
SQL 数据库 Windows
YashanDB Windows客户端安装
本文介绍YashanDB客户端(Windows)的安装、使用及卸载步骤。首先,下载并解压软件包至本地路径,配置环境变量。接着,通过cmd窗口使用yasql命令连接数据库,执行SQL操作。最后,卸载时删除相关环境变量和客户端目录。更多功能请参考官方文档。
YashanDB Windows客户端安装
|
数据采集 监控 数据管理
数据治理之道:大数据平台的搭建与数据质量管理
【10月更文挑战第26天】随着信息技术的发展,数据成为企业核心资源。本文探讨大数据平台的搭建与数据质量管理,包括选择合适架构、数据处理与分析能力、数据质量标准与监控机制、数据清洗与校验及元数据管理,为企业数据治理提供参考。
431 1
|
JavaScript API 开发者
GraphQL API开发入门:比RESTful更高效的数据查询方式
**GraphQL API开发入门摘要** GraphQL是一种更高效的数据查询方式,解决RESTful API的过度或不足获取数据问题。它允许客户端按需获取数据,减少网络传输,支持一次请求获取多资源。强类型和自描述特性方便了开发。文章通过一个简单的Node.js示例,展示如何使用`apollo-server-express`搭建GraphQL服务器,包括定义Schema、实现Resolver和创建服务器。通过测试,显示了GraphQL如何提供精确数据和优化查询效率。对于复杂数据需求,GraphQL是现代API设计的有效选择。
357 0
|
8月前
|
存储 监控 算法
基于 C# 时间轮算法的控制局域网上网时间与实践应用
在数字化办公与教育环境中,局域网作为内部网络通信的核心基础设施,其精细化管理水平直接影响网络资源的合理配置与使用效能。对局域网用户上网时间的有效管控,已成为企业、教育机构等组织的重要管理需求。这一需求不仅旨在提升员工工作效率、规范学生网络使用行为,更是优化网络带宽资源分配的关键举措。时间轮算法作为一种经典的定时任务管理机制,在局域网用户上网时间管控场景中展现出显著的技术优势。本文将系统阐述时间轮算法的核心原理,并基于 C# 编程语言提供具体实现方案,以期深入剖析该算法在局域网管理中的应用逻辑与实践价值。
226 5
|
人工智能 自然语言处理 算法
“破冰”探索两周年,AI和媒体碰撞出了什么火花?
2022年末,大模型浪潮席卷新闻媒体行业,引发内容生产方式的深刻变革。2023年1月,传播大脑科技公司在杭州成立,成为浙江新闻传媒领域的重要探索。两年后,大模型技术进一步重构新闻生产和分发逻辑,传播大脑通过整合资源、打破壁垒,推出了国内首个媒体垂类大模型,并在全国范围内推广“浙江模式”,助力多省份媒体融合进程。2025年初,传播大脑在智能化办公、内容创作和形式创新等方面取得显著成果,为媒体行业的未来提供了新的解决方案和启示。
280 14
|
数据采集 存储 数据挖掘
CDGA|解锁数据价值:基础数据治理的至关重要性
在数据驱动时代,数据成为企业的宝贵资产。本文探讨了数据治理的重要性,介绍其为核心管理活动,确保数据的可用性、完整性、安全性和合规性。良好的数据治理能提升数据质量、加强安全、促进共享,并支持高效决策,从而帮助企业最大化数据价值。通过明确目标、建立组织、制定政策和强化技术支持,企业可以构建起科学的数据治理体系,推动未来发展。
|
弹性计算 自然语言处理 API
速成RAG+Agent框架大模型应用搭建
本文侧重于能力总结和实操搭建部分,从大模型应用的多个原子能力实现出发,到最终串联搭建一个RAG+Agent架构的大模型应用。