文档章节

SparkSQL内置函数统计uv实例

别寒
 别寒
发布于 2017/07/28 14:45
字数 378
阅读 9
收藏 0
package com.hhb.spark.sql

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.{Row, SQLContext}
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType};
import org.apache.spark.sql.functions._

/**
  * Created by dell on 2017/7/28.
  */
object DailyUV {
  def main(args: Array[String]) {
    val conf = new SparkConf()
      .setAppName("DailyUV")
      .setMaster("local")
      .set("spark.testing.memory", "2147480000")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)

    // 要使用spark sql 内置函数,就必须在这里导入sqlcontext下的隐式转换
    import sqlContext.implicits._

    // 构造用户访问日志数据,并创建dataframe
    // 模拟用户访问日志,日志用逗号隔开,第一列日期,第二栏用户id
    val userAccesslog = Array(
      "2017-07-01,1122",
      "2017-07-01,1122",
      "2017-07-01,1123",
      "2017-07-01,1124",
      "2017-07-01,1124",
      "2017-07-01,1123",
      "2017-07-02,1124",
      "2017-07-02,1124",
      "2017-07-02,1123",
      "2017-07-02,1124",
      "2017-07-03,1124"
    )
    val userAccessLogRDD = sc.parallelize(userAccesslog, 5)

    // 将模拟出来的用户访问日志RDD,转换为dataframe
    // 首先将普通的rdd转换为元素为row的rdd
    val userAccessLogRowRDD = userAccessLogRDD
      .map{ log => Row(log.split(",")(0), log.split(",")(1).toInt) }
    // 构造dataframe的元数据
    val structType = StructType(Array(
      StructField("date", StringType, true),
      StructField("userid", IntegerType, true)
    ))

    // 使用sqlcontext创建dataframe
    val userAccessLogRowDF = sqlContext.createDataFrame(userAccessLogRowRDD, structType)

    // 这里正式开始使用spark1.5.x提供的最新特效 内置函数
    /**
      * 聚合函数的用法
      * 首先,对dataFrame调用groupBy方法,对某一列进行分组
      * 然后,调用agg方法,第一个参数必须传入之前在groupBy()方法中出现的字段
      * 第二个参数,传入countDistinct、sum、first等,spark提供的内置函数
      * 内置函数中,传入的参数,也是用单引号作为前缀的其他的字段
      */
    userAccessLogRowDF.groupBy("date")
      .agg('date, countDistinct('userid))
      .map{ row => Row(row(1), row(2)) }
      .collect()
      .foreach(println)



  }
}

© 著作权归作者所有

共有 人打赏支持
别寒
粉丝 29
博文 271
码字总数 137605
作品 0
永州
程序员
私信 提问
阿里年薪50WJAVA工程师转大数据学习路线!

大数据有两个方向,一个是偏计算机的,另一个是偏经济的。你学过Java,所以你可以偏将计算机的。 Java程序员想转大数据可行吗?Java是全世界使用人数最多的编程语言。不少程序员选择Java做为...

JAVA丶学习
04/25
0
0
Spark SQL 用户自定义函数UDF、用户自定义聚合函数UDAF 教程(Java踩坑教学版)

在Spark中,也支持Hive中的自定义函数。自定义函数大致可以分为三种: UDF(User-Defined-Function),即最基本的自定义函数,类似tochar,todate等 UDAF(User- Defined Aggregation Funcation...

青夜之衫
2017/12/04
0
0
丹露 datav数据大屏经验总结

11/21/2017 11:31:46 AM 第一版 丹露成都网络技术有限公司 运维部:周龙波 11/27/2017 2:04:32 PM 第二版 新增 pv/uv 折线图 访问来源 地图 的内网IP过滤功能以及使用新的时间段函数 12/6/2...

dlpy
01/03
0
0
网站流量UV是什么意思?什么是流量UV/PV/IP

雅虎统计基础数据定义 PV(访问量): 即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次。 UV(独立访客): 即Unique Visitor,访问您网站的一台电脑客户端为一个访客。00:00-24:00...

晨曦之光
2012/03/09
259
0
网站流量PV是什么意思?UV是什么意思?

雅虎统计基础数据定义 PV(访问量):即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次。 UV(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客。00:00-24:00内...

anlve
2017/05/19
6
0

没有更多内容

加载失败,请刷新页面

加载更多

详解如何实现一个简单的 vuex

首先我们需要知道为何要使用 vuex。父子组件通信用 prop 和自定义事件可以搞定,简单的非父子组件通信用 bus(一个空的 Vue 实例)。那么使用 vuex 就是为了解决复杂的非父子组件通信。 仅仅...

嫣然丫丫丫
12分钟前
0
0
算法——RangePartitioner实现之reservoirSample

简介 reservoir的作用是:**在不知道文件总行数的情况下,如何从文件中随机的抽取一行?**即是说如果最后发现文字档共有N行,则每一行被抽取的概率均为1/N? 我们可以:定义取出的行号为cho...

freeli
15分钟前
0
0
Python安装及netcdf数据读写

一、在CentOS7系统上安装Python3 在anaconda官网下载(http://https://www.anaconda.com/download/#linux)(Anaconda指的是一个开源的Python发行版本,是Python的包管理器和环境管理器) 下...

voole
18分钟前
0
0
基于NEO的私链(Private Blockchain)

1.准备工作 1.NEO-GUI 2.NEO-CLI 3..NET Core Runtime (不能是2.x版本,官方建议是1.12,实际上我用1.14也是没有问题的) 4.四台windows操作系统的虚拟机(本文是基于AWS的,理论上本地跑虚...

NEO-FANS
25分钟前
0
0
linux中shell if 判断总结

UNIX Shell 里面比较字符写法 -eq 等于; -ne 不等于; -gt 大于; -lt 小于 ; -le 小于等于; -ge 大于等于; -z 空串; -n 非空串; = 两个字符相等; != 两个字符不等 无论什么编程语言都离不开条...

linuxprobe16
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部