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 对原始数据进行倒排索引
结果如下:
用户名 | 列一 | 列二 | 列三 |
---|---|---|---|
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.test import org.apache.spark.sql.SparkSession object 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)
附图:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
spark 将DataFrame所有的列类型改为double
版权声明:本文由董可伦首发于https://dongkelun.com,非商业转载请注明作者及原创出处。商业转载请联系作者本人。 https://blog.csdn.net/dkl12/article/details/80256585 我的原创地址:https://dongkelun.com/2018/04/27/dfChangeAllColDatatypes/ 前言 由于spark机器学习要求输入的DataFrame类型为数值类型,所以如果原始数据读进来的列为string类型,需要一一转化,而如果列很多的情况下一个转化很麻烦,所以能不能一个循环或者一个函数去解决呢。 1、单列转化方法 import org.apache.spark.sql.types._ val data = Array(("1", "2", "3", "4", "5"), ("6", "7", "8", "9", "10")) val df = spark.createDataFrame(data).toDF("col1", "col2", "col3", "col4", "col5") import org.ap...
- 下一篇
spark ML算法之线性回归使用
版权声明:本文由董可伦首发于https://dongkelun.com,非商业转载请注明作者及原创出处。商业转载请联系作者本人。 https://blog.csdn.net/dkl12/article/details/80259410 我的原创地址:https://dongkelun.com/2018/04/09/sparkMlLinearRegressionUsing/ 前言 本文是讲如何使用spark ml进行线性回归,不涉及线性回归的原理。 1、数据格式 1.1 普通标签格式 1.1.1 格式为: 标签,特征值1 特征值2 特征值3... 1,1.9 2,3.1 3,4 3.5,4.45 4,5.02 9,9.97 -2,-0.98 1.1.2 spark 读取 1、Rdd 旧版(mllib)的线性回归要求传入的参数类型为RDD[LabeledPoint] import org.apache.spark.SparkConf import org.apache.spark.SparkContext import org.apache.spark.mllib.linalg.Vecto...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果