博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spark 统计每天新增用户数
阅读量:7083 次
发布时间:2019-06-28

本文共 1402 字,大约阅读时间需要 4 分钟。

版权声明:本文由董可伦首发于https://dongkelun.com,非商业转载请注明作者及原创出处。商业转载请联系作者本人。 https://blog.csdn.net/dkl12/article/details/80256688

我的原创地址:

前言

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

1、原始数据

2017-01-01  a2017-01-01  b2017-01-01  c2017-01-02  a2017-01-02  b2017-01-02  d2017-01-03  b2017-01-03  e2017-01-03  f

根据数据可以看出我们要求的结果为:

2017-01-01 新增三个用户(a,b,c)
2017-01-02 新增一个用户(d)
2017-01-03 新增两个用户(e,f)

2、解题思路

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

结果如下:

用户名 列一 列二 列三
a 2017-01-01 2017-01-02
b 2017-01-01 2017-01-02 2017-01-03
c 2017-01-01
d 2017-01-02
e 2017-01-03
f 2017-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)

附图:

你可能感兴趣的文章
linx 实用操作命令二
查看>>
数字转大写
查看>>
js中用户名的正则(字符,数字,下划线,减号)
查看>>
JavaScript splice() 方法和JavaScript split() 方法
查看>>
记录Nginx作为静态资源web服务场景配置
查看>>
AVI编码器
查看>>
LeetCode-112. Path Sum
查看>>
hdu Big Number
查看>>
mysql 日志文件mysql-bin文件清除方法,和mysql-bin相关文件的配置
查看>>
hdu 6050 Funny Function 矩阵快速幂
查看>>
Git学习总结(2)——初识 GitHub
查看>>
Maven学习总结(5)——聚合与继承
查看>>
SUPERVISOR进程管理器配置指南
查看>>
解决:no device found for connection ‘ System eth0′
查看>>
jacob使用入门及问题解析
查看>>
实例讲解虚拟机3种网络模式(桥接、nat、Host-only)
查看>>
javascript相关
查看>>
51 Node 1174
查看>>
deeplink技术的两篇资料
查看>>
矩阵求和及Kadane算法
查看>>