蚂蚁森林植物申领统计

使用spark sql DSL完成以下作业

背景说明

下表记录了用户每天的蚂蚁森林低碳生活领取的记录流水。

table_name:user_low_carbon

字段名 字段描述
user_id 用户
data_dt 日期
low_carbon 减少碳排放(g)

蚂蚁森林植物换购表,用于记录申领环保植物所需要减少的碳排放量

table_name: plant_carbon

字段名 字段描述
plant_id 植物编号
plant_name 植物名
plant_carbon 换购植物所需要的碳

数据样例

user_low_carbon:

user_id date_dt low_carbon
u_001 2017/1/1 10
u_001 2017/1/2 150
u_001 2017/1/2 110
u_001 2017/1/2 10
u_001 2017/1/4 50
u_001 2017/1/4 10
u_001 2017/1/6 45
u_001 2017/1/6 90
u_002 2017/1/1 10
u_002 2017/1/2 150
u_002 2017/1/2 70
u_002 2017/1/3 30
u_002 2017/1/3 80
u_002 2017/1/4 150
u_002 2017/1/5 101
u_002 2017/1/6 68

plant_carbon:

plant_id plant_name plant_carbon
p001 梭梭树 17
p002 沙柳 19
p003 樟子树 146
p004 胡杨 215

题目一

蚂蚁森林植物申领统计
问题:假设2017年1月1日开始记录低碳数据(user_low_carbon),假设2017年10月1日之前满足申领条件的用户都申领了一颗p004-胡杨,
剩余的能量全部用来领取“p002-沙柳” 。
统计在10月1日累计申领“p002-沙柳” 排名前10的用户信息;以及他比后一名多领了几颗沙柳。
得到的统计结果如下表样式:

user_id  plant_count less_count(比后一名多领了几颗沙柳)
u_101    1000         100
u_088    900          400
u_103    500          …

题目二

蚂蚁森林低碳用户排名分析,
问题:查询user_low_carbon表中每日流水记录,条件为:
用户在2017年,连续三天(或以上)的天数里,
每天减少碳排放(low_carbon)都超过100g的用户低碳流水。
需要查询返回满足以上条件的user_low_carbon表中的记录流水。
例如用户u_002符合条件的记录如下,因为2017/1/2~2017/1/5连续四天的碳排放量之和都大于等于100g:

user_id data_dt  low_carbonu_002  2017/1/2  150u_002  2017/1/2  70u_002  2017/1/3  30u_002  2017/1/3  80u_002  2017/1/4  150u_002  2017/1/5  101

答案:

package com.sql
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.{DataFrame, SparkSession}
import scala.language.postfixOpsobject HomeWork {def main(args: Array[String]): Unit = {val spark: SparkSession = SparkSession.builder.master("local").appName("maYi").config("spark.sql.shuffle.partitions", 1).getOrCreateimport org.apache.spark.sql.functions._import spark.implicits._//读取数据val userDF: DataFrame = spark.read.format("csv").option("sep", "\t").schema("uid STRING, data STRING, low_c STRING").load("data/mayi_anli/user_low_carbon.txt")val plantDF: DataFrame = spark.read.format("csv").option("sep", "\t").schema("pid STRING, pname STRING, p_c STRING").load("data/mayi_anli/plant_carbon.txt")userDF.show()plantDF.show()/*** 蚂蚁森林植物申领统计问题:假设2017年1月1日开始记录低碳数据(user_low_carbon),假设2017年10月1日之前满足申领条件的用户都申领了一颗p004-胡杨,剩余的能量全部用来领取“p002-沙柳” 。统计在10月1日累计申领“p002-沙柳” 排名前10的用户信息;以及他比后一名多领了几颗沙柳。**/userDF//格式化日期,取出小于10月的月份,.where((month(from_unixtime(unix_timestamp($"data","yyyy/mm/dd"),"yyyy-mm-dd"))) <10)//按照人分区,求出总的减少碳排放量.groupBy($"uid").agg(sum($"low_c") as "sum_c")//求出所有人领了多少颗的p002-沙柳.withColumn("plant_count",when($"sum_c" > 215,round(($"sum_c"-215) / 19)).otherwise("不满足申领条件"))//按照p002-沙柳棵树降序排列,求出下一人的领取量.withColumn("shang_duo",lag($"plant_count",-1) over Window.orderBy($"sum_c".desc))//将自己的领取量减去下家的领取量,得出比下家多的量.withColumn("less_count", $"plant_count" -$"shang_duo"   )//取出想要的字段.select($"uid",$"plant_count",$"less_count").limit(10)//.show()/***蚂蚁森林低碳用户排名分析,问题:查询user_low_carbon表中每日流水记录,条件为:用户在2017年,连续三天(或以上)的天数里,每天减少碳排放(low_carbon)都超过100g的用户低碳流水。需要查询返回满足以上条件的user_low_carbon表中的记录流水。例如用户u_002符合条件的记录如下,因为2017/1/2~2017/1/5连续四天的碳排放量之和都大于等于100g:**/userDF//将日期格式化,并按照uid,data 进行分组求出每个人每天的总排碳量.groupBy($"uid",(from_unixtime(unix_timestamp($"data","yyyy/mm/dd"),"yyyy-mm-dd")) as "date").agg(sum($"low_c") as "sum_c")//去除每天减碳量没达到 100 的人.where($"sum_c" >= 100)//按照每人来分组,在后面打大上标记.withColumn("rm",row_number() over Window.partitionBy($"uid").orderBy($"date"))//将date中的 天 取出来 减去 rm 就可以将连续的天数求出.withColumn("fenZu",dayofyear($"date") - $"rm")//取出连续3天排碳量都大于100的人.withColumn("lx>3",count($"fenZu") over Window.partitionBy($"uid",$"fenZu")).where($"lx>3" >= 3).select($"uid" as "user_id", $"date" as "data_dt",$"sum_c" as "low_carbon").show(1000)}}

数据

user:
u_001   2017/1/1    10
u_001   2017/1/2    150
u_001   2017/1/2    110
u_001   2017/1/2    10
u_001   2017/1/4    50
u_001   2017/1/4    10
u_001   2017/1/6    45
u_001   2017/1/6    90
u_002   2017/1/1    10
u_002   2017/1/2    150
u_002   2017/1/2    70
u_002   2017/1/3    30
u_002   2017/1/3    80
u_002   2017/1/4    150
u_002   2017/1/5    101
u_002   2017/1/6    68
u_003   2017/1/1    20
u_003   2017/1/2    10
u_003   2017/1/2    150
u_003   2017/1/3    160
u_003   2017/1/4    20
u_003   2017/1/5    120
u_003   2017/1/6    20
u_003   2017/1/7    10
u_003   2017/1/7    110
u_004   2017/1/1    110
u_004   2017/1/2    20
u_004   2017/1/2    50
u_004   2017/1/3    120
u_004   2017/1/4    30
u_004   2017/1/5    60
u_004   2017/1/6    120
u_004   2017/1/7    10
u_004   2017/1/7    120
u_005   2017/1/1    80
u_005   2017/1/2    50
u_005   2017/1/2    80
u_005   2017/1/3    180
u_005   2017/1/4    180
u_005   2017/1/4    10
u_005   2017/1/5    80
u_005   2017/1/6    280
u_005   2017/1/7    80
u_005   2017/1/7    80
u_006   2017/1/1    40
u_006   2017/1/2    40
u_006   2017/1/2    140
u_006   2017/1/3    210
u_006   2017/1/3    10
u_006   2017/1/4    40
u_006   2017/1/5    40
u_006   2017/1/6    20
u_006   2017/1/7    50
u_006   2017/1/7    240
u_007   2017/1/1    130
u_007   2017/1/2    30
u_007   2017/1/2    330
u_007   2017/1/3    30
u_007   2017/1/4    530
u_007   2017/1/5    30
u_007   2017/1/6    230
u_007   2017/1/7    130
u_007   2017/1/7    30
u_008   2017/1/1    160
u_008   2017/1/2    60
u_008   2017/1/2    60
u_008   2017/1/3    60
u_008   2017/1/4    260
u_008   2017/1/5    360
u_008   2017/1/6    160
u_008   2017/1/7    60
u_008   2017/1/7    60
u_009   2017/1/1    70
u_009   2017/1/2    70
u_009   2017/1/2    70
u_009   2017/1/3    170
u_009   2017/1/4    270
u_009   2017/1/5    70
u_009   2017/1/6    70
u_009   2017/1/7    70
u_009   2017/1/7    70
u_010   2017/1/1    90
u_010   2017/1/2    90
u_010   2017/1/2    90
u_010   2017/1/3    90
u_010   2017/1/4    90
u_010   2017/1/4    80
u_010   2017/1/5    90
u_010   2017/1/5    90
u_010   2017/1/6    190
u_010   2017/1/7    90
u_010   2017/1/7    90
u_011   2017/1/1    110
u_011   2017/1/2    100
u_011   2017/1/2    100
u_011   2017/1/3    120
u_011   2017/1/4    100
u_011   2017/1/5    100
u_011   2017/1/6    100
u_011   2017/1/7    130
u_011   2017/1/7    100
u_012   2017/1/1    10
u_012   2017/1/2    120
u_012   2017/1/2    10
u_012   2017/1/3    10
u_012   2017/1/4    50
u_012   2017/1/5    10
u_012   2017/1/6    20
u_012   2017/1/7    10
u_012   2017/1/7    10
u_013   2017/1/1    50
u_013   2017/1/2    150
u_013   2017/1/2    50
u_013   2017/1/3    150
u_013   2017/1/4    550
u_013   2017/1/5    350
u_013   2017/1/6    50
u_013   2017/1/7    20
u_013   2017/1/7    60
u_014   2017/1/1    220
u_014   2017/1/2    120
u_014   2017/1/2    20
u_014   2017/1/3    20
u_014   2017/1/4    20
u_014   2017/1/5    250
u_014   2017/1/6    120
u_014   2017/1/7    270
u_014   2017/1/7    20
u_015   2017/1/1    10
u_015   2017/1/2    20
u_015   2017/1/2    10
u_015   2017/1/3    10
u_015   2017/1/4    20
u_015   2017/1/5    70
u_015   2017/1/6    10
u_015   2017/1/7    80
u_015   2017/1/7    60植物:
p001    梭梭树 17
p002    沙柳  19
p003    樟子树 146
p004    胡杨  215

spark-蚂蚁森林植物申领统计相关推荐

  1. 大数据Spark入门案例5–统计广告点击数量排行Top3(scala版本)

    大数据Spark入门案例5–统计每广告点击数量排行Top3(scala版本) 1 数据准备 链接:https://pan.baidu.com/s/1afzmL-hNsAJl1_gx_dH2ag 提取码 ...

  2. spark 集群单词统计_最近Kafka这么火,聊一聊Kafka:Kafka与Spark的集成

    Spark 编程模型 在Spark 中, 我们通过对分布式数据集的操作来表达计算意图 ,这些计算会自动在集群上 井行执行 这样的数据集被称为弹性分布式数据集 Resilient Distributed ...

  3. streaming接mysql数据库_[Spark streaming举例]-- 实时统计并且存储到mysql数据库中

    举例 package com.scala.my import org.apache.spark.SparkConf import org.apache.spark.streaming.Duration ...

  4. 使用maven构建一个基于Java的spark应用程序用于统计唐诗三百首中各汉字出现的次数

    目的:统计唐诗三百首全集每个汉字出现的次数 软件需求: 下载 Eclipse ,安装Maven 安装好JDK1.8 下载并配置了hadoop-2.7.3     spark-2.2.0-bin-had ...

  5. Spark编程实战-词频统计

    文章目录 RDD 例题 spark-shell Spark安装可参考:Spark集群安装-基于hadoop集群 RDD RDD(Rseilient Distributed Datasets)是一个分布 ...

  6. Spark 读取mysql表统计

    添加maven依赖 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-ja ...

  7. Spark 算子使用案例 -- 统计广告点击量 Top3

    1.数据准备 数据格式:时间戳,省份,城市,用户,广告,中间字段使用空格分隔. 数据的粒度是用户,每一条数据是用户在何时何地点击了广告. 1516609143867 6 7 64 16 1516609 ...

  8. Hive个人笔记总结

    一.Hive概述 1.1 简介 Hive是一个数据仓库软件 Hive主要使用HQL(类sql)来分析已经存储在分布式设备(HDFS)上的数据 Hive的本质是将用户编写的HQL,转换为MR/spark ...

  9. 大数据之Hive函数及案例

    7 函数 7.1 系统内置函数 #查看系统自带的函数 hive (default)> show functions; #显示自带的函数的用法 hive (default)> desc fu ...

最新文章

  1. -bash:command not found
  2. python使用del保留字定义一个函数-函数和代码复用 --Python
  3. 既有“基本盘”又有“增长盘”,宝盛集团的营销“生意经”
  4. gitlab 自动推送代码到gitee_Gitlab 利用 Webhook+jenkins 实现自动构建与部署
  5. 和菜鸟一起学linux内核源码之基础准备篇
  6. 搜狗词库爬虫(2):基础爬虫框架的运行流程
  7. asp.net 去除字符串右侧的最后一个字符
  8. apache 日志参数
  9. python3 面向对象、类、继承、组合、派生、接口、子类重用父类方法
  10. excel表中怎么插入visio_Microsoft Visio2007中vsdx文件怎么打开|Visio插入表格方法
  11. ubuntu google earth 乱码 自动关闭
  12. nmap扫描端口命令详解linux网络探测之网络安全
  13. Ubuntu18新系统火狐浏览器无法播放音乐和视频
  14. 【微信小程序】使图片占满整个屏幕的解决方案
  15. tensorflow的交叉熵函数_张量流的代价函数和四个交叉熵函数,与,tensorflow,四种
  16. nginx启动提示nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
  17. 举个栗子!Tableau 技巧(109):用 LOD 计算产品销售周期
  18. java 表格tr td_table、tr、td表格的行、单元格等属性说明
  19. spring的事务依赖
  20. STM32F103C8T6 0.42寸的OLED屏幕IIC例程

热门文章

  1. 贼好玩!几行代码将童年游戏搬上屏幕!
  2. Redis + Caffeine实现多级缓存
  3. 电脑备忘录怎么恢复删除的数据
  4. Maven导入org.apache.commons.codec或commons-codec.jar包
  5. 【词频统计】--用python的jieba进行英文文本词频统计
  6. MTK MT6169 clock buffer XO3输出控制方法
  7. 【万字总结】推荐几个常用数据可视化第三方库(附源码,建议收藏)
  8. 计算机软件计入无形资产摊销,软件入无形资产是否需要摊销
  9. 网络编程之一文读懂什么是IPv6
  10. 科大讯飞语音引擎错误20021或者21001