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)


目录
相关文章
|
关系型数据库 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
1152 0
|
10月前
|
SQL 数据库 Windows
YashanDB Windows客户端安装
本文介绍YashanDB客户端(Windows)的安装、使用及卸载步骤。首先,下载并解压软件包至本地路径,配置环境变量。接着,通过cmd窗口使用yasql命令连接数据库,执行SQL操作。最后,卸载时删除相关环境变量和客户端目录。更多功能请参考官方文档。
YashanDB Windows客户端安装
|
数据采集 监控 数据管理
数据治理之道:大数据平台的搭建与数据质量管理
【10月更文挑战第26天】随着信息技术的发展,数据成为企业核心资源。本文探讨大数据平台的搭建与数据质量管理,包括选择合适架构、数据处理与分析能力、数据质量标准与监控机制、数据清洗与校验及元数据管理,为企业数据治理提供参考。
415 1
|
JavaScript API 开发者
GraphQL API开发入门:比RESTful更高效的数据查询方式
**GraphQL API开发入门摘要** GraphQL是一种更高效的数据查询方式,解决RESTful API的过度或不足获取数据问题。它允许客户端按需获取数据,减少网络传输,支持一次请求获取多资源。强类型和自描述特性方便了开发。文章通过一个简单的Node.js示例,展示如何使用`apollo-server-express`搭建GraphQL服务器,包括定义Schema、实现Resolver和创建服务器。通过测试,显示了GraphQL如何提供精确数据和优化查询效率。对于复杂数据需求,GraphQL是现代API设计的有效选择。
334 0
|
监控 搜索推荐 安全
探究亚马逊详情API接口:开发与应用
在数字化时代,亚马逊作为全球领先的电商平台,为商家和消费者提供了丰富的商品信息和便捷的购物体验。本文深入探讨了亚马逊详情API接口的获取与运用,帮助开发者和商家实时监控商品数据、分析市场趋势、优化价格策略、分析竞争对手、构建推荐系统及自动化营销工具,从而在竞争中占据优势。文章还提供了Python调用示例和注意事项,确保API使用的安全与高效。
436 3
|
数据采集 存储 数据挖掘
CDGA|解锁数据价值:基础数据治理的至关重要性
在数据驱动时代,数据成为企业的宝贵资产。本文探讨了数据治理的重要性,介绍其为核心管理活动,确保数据的可用性、完整性、安全性和合规性。良好的数据治理能提升数据质量、加强安全、促进共享,并支持高效决策,从而帮助企业最大化数据价值。通过明确目标、建立组织、制定政策和强化技术支持,企业可以构建起科学的数据治理体系,推动未来发展。
|
弹性计算 自然语言处理 API
速成RAG+Agent框架大模型应用搭建
本文侧重于能力总结和实操搭建部分,从大模型应用的多个原子能力实现出发,到最终串联搭建一个RAG+Agent架构的大模型应用。
|
安全 Java 网络安全
如何处理Java中的SSLException异常?
如何处理Java中的SSLException异常?
成功解决:ERROR StatusLogger No log4j2 configuration file found.
成功解决:ERROR StatusLogger No log4j2 configuration file found.
|
存储 机器学习/深度学习 人工智能
《达摩院2023十大科技趋势》——范式重置——存算一体
《达摩院2023十大科技趋势》——范式重置——存算一体
696 1

热门文章

最新文章