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上海摩拜共享单车数据分析相关推荐

  1. 摩拜共享单车数据分析项目报告

    文章目录 项目背景 数据探索 数据挖掘 数据分析 时间维度 空间维度 用户维度 项目背景 随着智能手机的普及和手机用户的激增,共享单车作为城市交通系统的一个重要组成部分,以绿色环保.便捷高效.经济环保 ...

  2. sql date类型_共享单车数据分析的SQL数据库设计

    SQL,发音为" sequel"(或SQL,如果愿意的话),是数据科学家的重要工具.实际上,它可以说是获取数据工作中最重要的语言.在共享单车数据分析的SQL设计中,我们将从入门者的 ...

  3. 摩拜共享单车技术含量

    共享单车已经成为了中国新四大发明之一,被输往了世界上很多城市.共享单车实质是一个"物联网+互联网"应用.应用一边是物,一边是人,通过云端的控制来向用户提供单车租赁服务. 一.共享单 ...

  4. OFO和摩拜共享单车

    目前,手机中装有OFO的APP和摩拜小程序.OFO已经交押金,而摩拜未交押金,每个礼拜只限体验5次.接下来谈一下我对两种APP的对比: (1)OFO和摩拜押金都是299元. (2)OFO制造成本低,不 ...

  5. 专业实训---摩拜共享单车

  6. 共享单车数据分析的SQL数据库设计

    SQL,发音为" sequel"(或SQL,如果愿意的话),是数据科学家的重要工具.实际上,它可以说是获取数据工作中最重要的语言.在共享单车数据分析的SQL设计中,我们将从入门者的 ...

  7. 【牛客】摩拜2018校招数据分析工程师笔试解析

    [牛客]摩拜2018校招数据分析工程师笔试解析 * 选择题都有正确答案,后面五道大题均是我的答案,欢迎大家讨论纠正! (https://www.nowcoder.com/test/11453292/s ...

  8. 毕业设计 题目:基于大数据的共享单车数据分析

    文章目录 0 前言 1 项目背景 2 项目分析思维导图 3 项目分析具体步骤 3.1 读取数据 3.2 数据分析 3.1.1 数据预处理--每日使用量分析 3.1.2 连续7天的单日使用分析结论 3. ...

  9. 摩拜OFO单车哪家强,看他们的网站似乎发现了点什么

    自共享单车风靡以来,关于摩拜单车和OFO的大战就从未停歇.先不说线下不断拓展市场份额,在互联网基础产品上,两家品牌都是争得你死我活.比如悄无声息的域名比较大战,还有笔者最近发现的企业官网大战,无不透露 ...

最新文章

  1. 集合list set Map问题
  2. linux下的/dev/shm/ 以及与swap目录的区别【转】
  3. ELK收集日志到mysql数据库
  4. css 样式三元运算_20条书写CSS代码的建议
  5. 搞笑之----普通话
  6. pythonrequests说明_解决Python requests 报错方法集锦
  7. python上传文件接口_python程序的web接口:上传和下载文件
  8. 第一行代码阅读笔记---基本知识
  9. ORACLE坏块检查
  10. Linq to xml修改CDATA节点值
  11. 【油猴脚本】GM_xmlhttpRequest跨域请求初探
  12. 乘法鉴相器的matlab仿真,Matlab仿真costas环代码问题。
  13. 开发人员如何规划自己的职业生涯
  14. 选择并遮住工具(边缘调整工具)+剪切蒙版法,扣除头发丝
  15. 尺子英语怎么读计算机英语怎么读,尺子的英文是什么用英语怎么说
  16. QtCreator生成标准多行函数或者类详细注释
  17. 鸿蒙harmonyOS 方舟框架ARK使用ets的页面间转场动画的使用
  18. 四大门户免费企业邮箱用户端基础参数对比
  19. 【STM32】STM32之DRV8834电机驱动(IO方式)
  20. 论文笔记 Feature Selective Anchor-Free Module for Single-Shot Object Detection - CVPR 2019

热门文章

  1. 2022-2027年中国记忆绵床垫行业发展前景及投资战略咨询报告
  2. Gurobi运筹学开发教程03:python+gurobi实现bender decomposition 算法示例代码
  3. 基于SpringBoot旅游信息管理系统
  4. C语言-分支结构if-else
  5. 2021数据科学平台领域最具商业合作价值企业盘点
  6. IMX6ULL移植LVGL
  7. 【Matlab】图形用户界面设计
  8. 关于mobiscroll日期插件无法正确的选中默认日期
  9. 计算机的算数运算符号位参与计算吗,C语言算术运算符和算术表达式
  10. WIFI模块遇到的问题