Spark SQL上海摩拜共享单车数据分析
1 生成DataFrame对象
val bikeDF = sqlContext.read.format("csv").option("header", "true").option("timestampFormat", "yyyy-MM-dd HH:mm").load("src/main/scala/com/zhangz1/mobike_shanghai_sample_updated.csv")
2 展示数据
bikeDF.show()
3 根据起始时间统计周一至周日每天的骑行次数
核心SQL语句:
select dayofweek(start_time) as day,count(*) as count from bike group by day
核心代码:
val day_count = bikeDF.select(dayofweek(col("start_time")).alias("day")).groupBy("day").count().withColumn("day",when(col("day") === 1, "周日").otherwise(when(col("day") === 2, "周一").otherwise(when(col("day") === 3, "周二").otherwise(when(col("day") === 4, "周三").otherwise(when(col("day") === 5, "周四").otherwise(when(col("day") === 6, "周五").otherwise(when(col("day") === 7, "周六").otherwise("未知"))))))))
day_count.show()
4 根据起始时间统计一天中每个小时的骑行次数并进行降序排列
核心SQL语句:
select hour(start_time) as hour, count(*) as count from bike group by hour order by hour desc
核心代码:
val hour_count = bikeDF.select(hour(col("start_time")).alias("hour")).groupBy("hour").count().withColumn("hour",when(col("hour") === 0, "0点").otherwise(when(col("hour") === 1, "1点").otherwise(when(col("hour") === 2, "2点").otherwise(when(col("hour") === 3, "3点").otherwise(when(col("hour") === 4, "4点").otherwise(when(col("hour") === 5, "5点").otherwise(when(col("hour") === 6, "6点").otherwise(when(col("hour") === 7, "7点").otherwise(when(col("hour") === 8, "8点").otherwise(when(col("hour") === 9, "9点").otherwise(when(col("hour") === 10, "10点").otherwise(when(col("hour") === 11, "11点").otherwise(when(col("hour") === 12, "12点").otherwise(when(col("hour") === 13, "13点").otherwise(when(col("hour") === 14, "14点").otherwise(when(col("hour") === 15, "15点").otherwise(when(col("hour") === 16, "16点").otherwise(when(col("hour") === 17, "17点").otherwise(when(col("hour") === 18, "18点").otherwise(when(col("hour") === 19, "19点").otherwise(when(col("hour") === 20, "20点").otherwise(when(col("hour") === 21, "21点").otherwise(when(col("hour") === 22, "22点").otherwise(when(col("hour") === 23, "23点").otherwise("未知")))))))))))))))))))))))))hour_count.sort(col("count").desc).show(24)
5 根据起始时间和结束时间计算骑行时长统计信息,命名为riding_time列
核心SQL语句:
select *,(end_time-start_time) as riding_time from bike
核心代码:
val riding_time = bikeDF.withColumn("riding_time", (unix_timestamp(col("end_time"), "yyyy-MM-dd HH:mm") - unix_timestamp(col("start_time"), "yyyy-MM-dd HH:mm"))./(60)).select("riding_time")riding_time.summary().show()
运行截图:
6 根据起始时间统计早晚高峰和平峰的骑行次数
val morn_even_peak = bikeDF.select(hour(col("start_time")).alias("hour")).withColumn("hour",when(col("hour").>(6).&&(col("hour").<=(8)), "早高峰").otherwise(when(col("hour").>(17).&&(col("hour").<=(20)), "晚高峰").otherwise("平峰"))).groupBy("hour").count()morn_even_peak.show()
7 用户分级(RFM模型)
R值:即每个用户最后一次租赁共享单车的时间距9月1日多少天
val last_rent_day = bikeDF.select(col("userid").alias("r"), datediff(lit("2016-09-01 00:00"), col("start_time")).alias("last_rent_day")).groupBy("r").agg(min("last_rent_day").alias("r_value"))
F值:即每个用户累计租赁单车频次
val rent_count = bikeDF.select(col("userid").alias("f")).groupBy("f").agg(count("f").alias("f_value"))
M值:即每个 用户累积消费金额
val total_cost = bikeDF.select(col("userid").alias("m"), (unix_timestamp(col("end_time"), "yyyy-MM-dd HH:mm") - unix_timestamp(col("start_time"), "yyyy-MM-dd HH:mm"))./(60).alias("total_cost")).withColumn("total_cost",when(col("total_cost").%(30).=!=(0), col("total_cost")./(30) + 1).otherwise(col("total_cost")./(30)).alias("total_cost")).groupBy("m").agg(sum("total_cost").alias("m_value")).select(col("m"), round(col("m_value"), 2).alias("m_value"))
合并到一个DataFrame中
val rfm = last_rent_day.join(rent_count, last_rent_day("r") === rent_count("f")).join(total_cost, last_rent_day("r") === total_cost("m")).select(last_rent_day("r").alias("userid"), last_rent_day("r_value"), rent_count("f_value"), total_cost("m_value"))
计算RFM分数并对RFM平均值进行对比
//计算R分数
val rfm_score = rfm.withColumn("r_score",when(col("r_value").>(14), 1).otherwise(when(col("r_value").>(7).&&(col("r_value").<=(14)), 2).otherwise(when(col("r_value").>(3).&&(col("r_value").<=(7)), 3).otherwise(when(col("r_value").>(1).&&(col("r_value").<=(3)), 4).otherwise(when(col("r_value").>(0).&&(col("r_value").<=(1)), 5).otherwise(1))))))//计算F分数.withColumn("f_score",when(col("f_value").>(20), 5).otherwise(when(col("f_value").>(15).&&(col("f_value").<=(20)), 4).otherwise(when(col("f_value").>(10).&&(col("f_value").<=(15)), 3).otherwise(when(col("f_value").>(5).&&(col("f_value").<=(10)), 2).otherwise(when(col("f_value").>(0).&&(col("f_value").<=(5)), 1).otherwise(1))))))//计算M分数.withColumn("m_score",when(col("m_value").>(100), 5).otherwise(when(col("m_value").>(60).&&(col("m_value").<=(100)), 4).otherwise(when(col("m_value").>(30).&&(col("m_value").<=(60)), 3).otherwise(when(col("m_value").>(10).&&(col("m_value").<=(30)), 2).otherwise(when(col("m_value").>(0).&&(col("m_value").<=(10)), 1).otherwise(1))))))//RFM值和RFM平均值对比.withColumn("R是否大于均值", when(col("r_score").>(3.50), 1).otherwise(0)).withColumn("F是否大于均值", when(col("f_score").>(1.64), 1).otherwise(0)).withColumn("M是否大于均值", when(col("m_score").>(1.41), 1).otherwise(0)).withColumn("RFM分数", col("R是否大于均值").*(100).+(col("F是否大于均值").*(10)).+(col("M是否大于均值").*(1))).withColumn("用户类型", when(col("RFM分数").===(111), "重要价值用户").when(col("RFM分数").===(110), "消费潜力用户").when(col("RFM分数").===(101), "频次深耕用户").when(col("RFM分数").===(100), "新用户").when(col("RFM分数").===(11), "重要价值流失预警用户").when(col("RFM分数").===(10), "一般用户").when(col("RFM分数").===(1), "高消费唤回用户").when(col("RFM分数").===(0), "流失用户"))
rfm_score.show()
源代码以及数据集下载:
https://download.csdn.net/download/qq_48519116/85205902
Spark SQL上海摩拜共享单车数据分析相关推荐
- 摩拜共享单车数据分析项目报告
文章目录 项目背景 数据探索 数据挖掘 数据分析 时间维度 空间维度 用户维度 项目背景 随着智能手机的普及和手机用户的激增,共享单车作为城市交通系统的一个重要组成部分,以绿色环保.便捷高效.经济环保 ...
- sql date类型_共享单车数据分析的SQL数据库设计
SQL,发音为" sequel"(或SQL,如果愿意的话),是数据科学家的重要工具.实际上,它可以说是获取数据工作中最重要的语言.在共享单车数据分析的SQL设计中,我们将从入门者的 ...
- 摩拜共享单车技术含量
共享单车已经成为了中国新四大发明之一,被输往了世界上很多城市.共享单车实质是一个"物联网+互联网"应用.应用一边是物,一边是人,通过云端的控制来向用户提供单车租赁服务. 一.共享单 ...
- OFO和摩拜共享单车
目前,手机中装有OFO的APP和摩拜小程序.OFO已经交押金,而摩拜未交押金,每个礼拜只限体验5次.接下来谈一下我对两种APP的对比: (1)OFO和摩拜押金都是299元. (2)OFO制造成本低,不 ...
- 专业实训---摩拜共享单车
- 共享单车数据分析的SQL数据库设计
SQL,发音为" sequel"(或SQL,如果愿意的话),是数据科学家的重要工具.实际上,它可以说是获取数据工作中最重要的语言.在共享单车数据分析的SQL设计中,我们将从入门者的 ...
- 【牛客】摩拜2018校招数据分析工程师笔试解析
[牛客]摩拜2018校招数据分析工程师笔试解析 * 选择题都有正确答案,后面五道大题均是我的答案,欢迎大家讨论纠正! (https://www.nowcoder.com/test/11453292/s ...
- 毕业设计 题目:基于大数据的共享单车数据分析
文章目录 0 前言 1 项目背景 2 项目分析思维导图 3 项目分析具体步骤 3.1 读取数据 3.2 数据分析 3.1.1 数据预处理--每日使用量分析 3.1.2 连续7天的单日使用分析结论 3. ...
- 摩拜OFO单车哪家强,看他们的网站似乎发现了点什么
自共享单车风靡以来,关于摩拜单车和OFO的大战就从未停歇.先不说线下不断拓展市场份额,在互联网基础产品上,两家品牌都是争得你死我活.比如悄无声息的域名比较大战,还有笔者最近发现的企业官网大战,无不透露 ...
最新文章
- 集合list set Map问题
- linux下的/dev/shm/ 以及与swap目录的区别【转】
- ELK收集日志到mysql数据库
- css 样式三元运算_20条书写CSS代码的建议
- 搞笑之----普通话
- pythonrequests说明_解决Python requests 报错方法集锦
- python上传文件接口_python程序的web接口:上传和下载文件
- 第一行代码阅读笔记---基本知识
- ORACLE坏块检查
- Linq to xml修改CDATA节点值
- 【油猴脚本】GM_xmlhttpRequest跨域请求初探
- 乘法鉴相器的matlab仿真,Matlab仿真costas环代码问题。
- 开发人员如何规划自己的职业生涯
- 选择并遮住工具(边缘调整工具)+剪切蒙版法,扣除头发丝
- 尺子英语怎么读计算机英语怎么读,尺子的英文是什么用英语怎么说
- QtCreator生成标准多行函数或者类详细注释
- 鸿蒙harmonyOS 方舟框架ARK使用ets的页面间转场动画的使用
- 四大门户免费企业邮箱用户端基础参数对比
- 【STM32】STM32之DRV8834电机驱动(IO方式)
- 论文笔记 Feature Selective Anchor-Free Module for Single-Shot Object Detection - CVPR 2019