关注公众号:分享电脑学习
回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新)
云盘目录说明:
tools目录是安装包
res 目录是每一个课件对应的代码和资源等
doc 目录是一些第三方的文档工具

承接上一篇文档《Spark案例练习-PV的统计

参数说明:

继续上面的PV代码编写即可

思路:UV的计算

1.数据进行过滤清洗,获取两个字段(时间、guid)

2.guid非空,时间非空,时间字符串的长度必须大于10

3.将同一天的数据放在一起,根据guid去重,统计去重的结果

代码:

val rdd2 = rdd.map(line => line.split("\t"))
.filter(arr => {
//保留正常数据
arr.length >=3 && arr(2).trim.nonEmpty && arr(0).trim.length > 10
})
.map(arr => {
val date = arr(0).trim.substring(0,10)
val guid = arr(2).trim
(date,guid) // (date,url)
})

继续编写代码

有两种方式:

1. 基于groupByKey进行UV的统计

2. 基于reduceByKey实现UV的统计

先看基于groupByKey进行UV的统计

val uvRdd = rdd2.groupByKey()
.map(t => {
val date = t._1
val guids = t._2
val uv = guids.toSet.size
(date,uv)
})
println("uv------------------" + uvRdd.collect().mkString(";"))

再看基于reduceByKey实现UV的统计

rdd2.map(t => {
((t._1,t._2),1)
})
.reduceByKey(_+_)
.map(_._1)
val uvRDD: RDD[(String, Int)] = rdd2.distinct()
.map(t => (t._1, 1))
.reduceByKey(_+_)
println("uv------------------" + uvRDD.collect().mkString(";"))

最终指标的合并

val pvuvRdd = pvRdd.fullOuterJoin(uvRdd)
.map(t => {
val date = t._1
val pv = t._2._1.getOrElse(0) //如果有值则返回对应的值,如果无值则返回0
val uv = t._2._2.getOrElse(0)
//返回结果
(date,pv,uv)
})

打印一下,可以看到合并的数据

数据输出(Driver、保存HDFS上,保存到RDBMS中)

数据返回给Driver

val result = pvuvRdd.collect()

保存到HDFS上

pvuvRdd.saveAsTextFile(s"hdfs://master:9000/data/pv_uv/${System.currentTimeMillis()}")

端口注意下,如果想用域名(master)就要确保在本地hosts文件配置了(win环境下)

运行一下,可以看到hdfs上有了这个文件

保存到RDBMS中、保存到非关系型数据库中

建库建表

CREATE DATABASE spark_test;

USE spark_test;

CREATE TABLE pvuv(
`date` DATE NOT NULL,
`pv` INT(11) NOT NULL,
`uv` INT(11) NOT NULL
)ENGINE=MYISAM DEFAULT CHARSET=utf8;

编写代码

其中val conn = DriverManager.getConnection("","","")这句话是url、user和password

代码

pvuvRdd.foreachPartition(iter => {
//1. 创建数据库连接对象
//2. 创建数据输出prepareStatement对象
val conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/spark_test","root","root")
val pstmt = conn.prepareStatement("insert into pvuv(date,pv,uv) values(?,?,?);")
//3. 数据迭代输出
iter.foreach(t => {
val date = t._1
val pv = t._2
val uv = t._3
pstmt.setString(1,date)
pstmt.setInt(2,pv)
pstmt.setInt(3,uv)
pstmt.executeUpdate()
})
//4. 关闭连接
conn.close()
pstmt.close()
})

运行代码,查看数据库

Spark案例练习-UV的统计的更多相关文章

  1. Spark案例练习-PV的统计

    关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新) 云盘目录说明: tools目录是安装包res   目录是每一个课件对应的代码和资源等doc  ...

  2. Spark案例练习-打包提交

    关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新)云盘目录说明:tools目录是安装包res 目录是每一个课件对应的代码和资源等doc 目录是一 ...

  3. Kafka与Spark案例实践

    1.概述 Kafka系统的灵活多变,让它拥有丰富的拓展性,可以与第三方套件很方便的对接.例如,实时计算引擎Spark.接下来通过一个完整案例,运用Kafka和Spark来合理完成. 2.内容 2.1 ...

  4. Spark学习笔记1——第一个Spark程序:单词数统计

    Spark学习笔记1--第一个Spark程序:单词数统计 笔记摘抄自 [美] Holden Karau 等著的<Spark快速大数据分析> 添加依赖 通过 Maven 添加 Spark-c ...

  5. 【Spark-core学习之九】 Spark案例

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  6. spark 应用场景2-身高统计

    原文引自:http://blog.csdn.net/fengzhimohan/article/details/78564610 a. 案例描述 本案例假设我们需要对某个省的人口 (10万) 性别还有身 ...

  7. [spark案例学习] WEB日志分析

    数据准备 数据下载:美国宇航局肯尼迪航天中心WEB日志 我们先来看看数据:首先将日志加载到RDD,并显示出前20行(默认). import sys import os log_file_path =' ...

  8. Spark Streaming的样本demo统计

    废话不多说,直接上代码 package com.demo; import java.util.List; import java.util.regex.Pattern; import org.apac ...

  9. 【机器学习之二】python开发spark案例

    环境 spark-1.6 python3.5 一.wordcount # -*- coding:utf-8 -*- ''' Created on 2019年5月13日 @author: Adminis ...

随机推荐

  1. [BUUCTF]REVERSE——[SUCTF2019]SignIn

    [SUCTF2019]SignIn 附件 步骤: 无壳,64位ida载入 程序调用了 __gmpz_init_set_str 函数,这是一个 GNU 高精度算法库,在RSA加密中见过几次,加上6553 ...

  2. C51单片机中断实验

    实验要求: 要求通过中断方式检测有无按键 判断哪个按键(编号0-9),并且在数码管上显示对应的0-9 代码部分 #include<reg51.h> char led_mod[]={0x3f ...

  3. CF447B DZY Loves Strings 题解

    Content 有一个长度为 \(n\) 的仅含小写字母的字符串 \(s\) 以及 26 个英文小写字母的价值 \(W_\texttt{a},W_\texttt{b},...,W_\texttt{z} ...

  4. LuoguB2106 矩阵转置 题解

    Content 给定一个 \(n\times m\) 的矩阵 \(A\),求其转置 \(A^\text T\). 数据范围:\(1\leqslant n,m\leqslant 100\). Solut ...

  5. java数据类型:集合存储元素类型限制<泛型> ;自定义类指定泛型<T> 以及限制用法;派生子类泛型<T> super(泛型内参数); 泛型通配符?以及?限制用法

    问题背景 Java 集合有个缺点,把一个对象"丢进"集合里之后,集合就会"忘记"这个对象的数据类型,当再次取出该对象时 该对象的编译类型就变Object类型(其 ...

  6. TensorFlow.NET机器学习入门【3】采用神经网络实现非线性回归

    上一篇文章我们介绍的线性模型的求解,但有很多模型是非线性的,比如: 这里表示有两个输入,一个输出. 现在我们已经不能采用y=ax+b的形式去定义一个函数了,我们只能知道输入变量的数量,但不知道某个变量 ...

  7. SpringBoot 整合MinIO

    引入依赖 <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifact ...

  8. Go1.18中的泛型编程

    目录 目录 前言 泛型是什么 Go的泛型 泛型函数 泛型类型 类型集合 和接口的差异 总结 前言 经过这几年的千呼万唤,简洁的Go语言终于在1.18版本迎来泛型编程.作为一门已经有了14年历史的强类型 ...

  9. c++设计模式概述之装饰器

    类写的不够规范,目的是为了缩短篇幅,实际中请不要这样做.  1.概述 想象一下修房子.当施工队把房子框架结构做好了,墙刷上了水泥, 这时,工队暂时没有钱,装修只能暂停了. 过了一段时间,工队筹集了资金 ...

  10. 【LeetCode】12. Integer to Roman 整数转罗马数字

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:roman, 罗马数字,题解,leetcode, 力扣, ...