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条评论来说两句吧...


微信收款码
支付宝收款码