为了账号安全,请及时绑定邮箱和手机立即绑定

spark 统计每天新增用户数

标签:
Spark

转载请务必注明原创地址为:https://dongkelun.com/2018/04/11/sparkNewUV/

前言

本文源自一位群友的一道美团面试题,解题思路(基于倒排索引)和代码都是这位大佬(相对于尚处于小白阶段的我)写的,我只是在基于倒排索引的基础上帮忙想出了最后一步思路,感觉这个解题思路不错,值得记录一下。

1、原始数据

2017-01-01  a
2017-01-01  b
2017-01-01  c
2017-01-02  a
2017-01-02  b
2017-01-02  d
2017-01-03  b
2017-01-03  e
2017-01-03  f

根据数据可以看出我们要求的结果为:
2017-01-01 新增三个用户(a,b,c)
2017-01-02 新增一个用户(d)
2017-01-03 新增两个用户(e,f)

2、解题思路

2.1 对原始数据进行倒排索引

结果如下:

用户名列一列二列三
a2017-01-012017-01-02
b2017-01-012017-01-022017-01-03
c2017-01-01

d2017-01-02

e2017-01-03

f2017-01-03

2.2 统计列一中每个日期出现的次数

这样我们只看列一,统计每个日期在列一出现的次数,即为对应日期新增用户数。

3、代码

package com.dkl.leanring.spark.testimport org.apache.spark.sql.SparkSessionobject NewUVDemo {  def main(args: Array[String]): Unit = {    val spark = SparkSession.builder().appName("NewUVDemo").master("local").getOrCreate()    val rdd1 = spark.sparkContext.parallelize(      Array(
        ("2017-01-01", "a"), ("2017-01-01", "b"), ("2017-01-01", "c"),
        ("2017-01-02", "a"), ("2017-01-02", "b"), ("2017-01-02", "d"),
        ("2017-01-03", "b"), ("2017-01-03", "e"), ("2017-01-03", "f")))    //倒排
    val rdd2 = rdd1.map(kv => (kv._2, kv._1))    //倒排后的key分组
    val rdd3 = rdd2.groupByKey()    //取最小时间
    val rdd4 = rdd3.map(kv => (kv._2.min, 1))
    rdd4.countByKey().foreach(println)
  }
}

结果:

(2017-01-03,2)
(2017-01-02,1)
(2017-01-01,3)

附图:


webp

image



作者:董可伦
链接:https://www.jianshu.com/p/3bfd165a97be


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消