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

orders表:

product表:

prior表:

实现以下业务需求:

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")

使用udf:1.导包

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

3.使用udf:

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:

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(","))

取出一条数据的结果:

3)隐式转换:

3.1导包:import spark.implicits._

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

结果:

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

总商品数量:
orders.join(priors,"order_id").groupBy("user_id").count().show(5)

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

结果:

解法2:

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)

SparkSQL实践相关推荐

  1. Spark 1.6 SparkSQL实践

    为什么80%的码农都做不了架构师?>>>    数据源CDN日志. 每行日志数据格式: 序号 名称 说明 1 客户端IP 2 预留字段 3 预留字段 4 请求时间 格式为:[dd/M ...

  2. 大数据工程师技能要求的学习路线图

    一.大数据相关工作介绍 大数据方向的工作目前主要分为三个主要方向: 1. 大数据工程师 2. 数据分析师 3. 大数据科学家 4. 其他(数据挖掘等) 二.大数据工程师的技能要求 附上大数据工程师技能 ...

  3. 2018年12月云栖技术活动最全资料汇总:50+直播与Meetup分享...

    云栖社区12月份技术活动资料下载大全:技术直播.系列公开课.Meetup.峰会.钉群分享等.欢迎分享给更多开发者. 2019年1月活动预告即将推出.欢迎加入社区钉群,将你所感兴趣的知识与话题共享给我们 ...

  4. 2018年12月云栖技术活动最全资料汇总:50+直播与Meetup分享

    云栖君导读:应开发者建议,云栖社区特别将线下沙龙和直播活动进行汇总,一键分享给大家.当然,从2019年1月起,我们还有预告版. 云栖社区12月份技术活动资料下载大全:技术直播.系列公开课.Meetup ...

  5. sparksql 操作hive_Spark SQL 物化视图原理与实践

    导言 物化视图作为一种预计算的优化方式,广泛应用于传统数据库中,如Oracle,MSSQL Server等.随着大数据技术的普及,各类数仓及查询引擎在业务中扮演着越来越重要的数据分析角色,而物化视图作 ...

  6. 史上最简单的spark教程第十三章-SparkSQL编程Java案例实践(终章)

    Spark-SQL的Java实践案例(五) 本章核心:JDBC 连接外部数据库,sparkSQL优化,故障监测 史上最简单的spark教程 所有代码示例地址:https://github.com/My ...

  7. binlog流程 mysql_小米 MySQL 数据实时同步到大数据数仓的架构与实践

    背景MySQL由于自身简单.高效.可靠的特点,成为小米内部使用最广泛的数据库,但是当数据量达到千万/亿级别的时候,MySQL的相关操作会变的非常迟缓:如果这时还有实时BI展示的需求,对于mysql来说 ...

  8. SparkSQL和Hadoop(面向数据科学家和大数据分析师)

    了解HDFS命令.Hadoop.Spark SQL.SQL查询.ETL和数据分析| Spark Hadoop集群虚拟机|完全解决的问题 你会学到什么 作为本课程的一部分,学生将获得在Spark Had ...

  9. 基于Hadoop的58同城离线计算平台设计与实践

    作者:余意,来自:DataFun 导读:58离线计算平台基于 Hadoop 生态体系打造,单集群4000+台服务器,数百 PB 存储,日40万计算任务,面临挑战极大.58大数据平台的定位主要是服务数据 ...

最新文章

  1. 干货|卷积有多少种?一文读懂深度学习中的各种卷积
  2. mysql自然连接和等值连接_mysql sql99语法 内连接等值连接
  3. Heartbeat+DRBD+NFS案例详解
  4. 【安全漏洞】一次前台任意文件下载漏洞挖掘
  5. python编程关键字_python编程关键字
  6. Vue mixins学习
  7. Mujoco 基本教程
  8. mac配置adb环境变量
  9. [EdgeAI] NXP eIQ 机器学习Toolkit (二):模型篇
  10. 入行数据分析要知道什么是概括性度量
  11. php model module,Yii2用Gii自动生成Module+Model+CRUD
  12. 中兴程序员跳楼事件始末解读
  13. 百度seo算法_SEO秘诀:Google的逆向工程算法
  14. 不可不知!4种常见的黑客攻击手段
  15. 使用NanoHTTPD在Android上建立本地服务器
  16. 计算机网络基础选择题
  17. USACO健康的荷斯坦奶牛(DFS,二进制暴力枚举)
  18. java httpget 传参数_Java 发送http请求(get、post)
  19. 计算机专业英语课外笔记,手帐 | 有了这份笔记后 我终于爱上了英语
  20. 通信网络安全与保密综述报告——无线通信系统网络安全发展的现状、趋势及新技术

热门文章

  1. unix环境高级编程-文件和目录(1)
  2. spring+hibernate:在applicationCOntext.XML中配置C3P0参数说明
  3. JS屏蔽360浏览器代码
  4. 一个网络传输框架——zeroMQ 调研笔记
  5. 【99JS手记】之一:nth-child选择器
  6. 程序员面试金典——17.4无判断max
  7. 剑指offer——面试题26:复杂链表的复制
  8. Leetcode 109.有序链表转换二叉搜索树
  9. 关于sinX与y的大小比较取值范围计算
  10. 深入浅出讲解LDA主题模型(一)