大数据之spark_spark SQL案例

连续登录三天的用户案例:

数据
uid,dt
guid01,2018-02-28
guid01,2018-03-01
guid01,2018-03-01
guid01,2018-03-05
guid01,2018-03-02
guid01,2018-03-04
guid01,2018-03-06
guid01,2018-03-07
guid02,2018-03-01
guid02,2018-03-03
guid02,2018-03-02
guid02,2018-03-06

SQL代码实现

package com.doit.spark.day10

import org.apache.spark.sql.{DataFrame, SparkSession}

object UsersLoginThreeDaysDemo {
  def main(args: Array[String]): Unit = {

    val sparkSession: SparkSession = SparkSession.builder().appName(this.getClass().getSimpleName).master("local[*]").getOrCreate()

    val dataFrame: DataFrame = sparkSession.read
      .option("header", "true") //读取数据的第一行作为表的字段名
      .option("inferSchema", "true") //自动推断数据类型
      .csv("D:\\每日总结\\视频\\spark\\spark-day10\\资料\\login.csv")

    dataFrame.createTempView("v_user_login")

    sparkSession.sql(
      s"""
        |
        |SELECT
        |  uid,
        |  MIN(dt) start_time,
        |  MAX(dt) end_time,
        |  COUNT(1) num_days
        |FROM
        |(
        |  SELECT
        |    uid,dt,
        |    DATE_SUB(dt,row_num) dis_date
        |  FROM
        |  (
        |    SELECT
        |      uid,dt,
        |      ROW_NUMBER() OVER(PARTITION BY uid ORDER BY dt ASC) as row_num --对uid开窗口,并在窗口内排序,打标记
        |    FROM
        |    (
        |      SELECT
        |        dis.uid,
        |        dis.dt
        |      FROM
        |      (
        |        SELECT
        |          DISTINCT(uid,dt) dis --将uid,dt联合去重
        |        FROM
        |          v_user_login
        |      )
        |    )
        |  )
        |)GROUP BY uid,dis_date HAVING num_days >= 3
        |
        |""".stripMargin).show()

sparkSession.stop()
  }
}

+------+----------+----------+--------+
|   uid|start_time|  end_time|num_days|
+------+----------+----------+--------+
|guid02|2018-03-01|2018-03-03|       3|
|guid01|2018-02-28|2018-03-02|       3|
|guid01|2018-03-04|2018-03-07|       4|
+------+----------+----------+--------+

DSL代码实现

package com.doit.spark.day10


import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.{DataFrame, SparkSession}

object UsersLoginThreeDaysDemo {
  def main(args: Array[String]): Unit = {

    val sparkSession: SparkSession = SparkSession.builder().appName(this.getClass().getSimpleName).master("local[*]").getOrCreate()

    val dataFrame: DataFrame = sparkSession.read
      .option("header", "true") //读取数据的第一行作为表的字段名
      .option("inferSchema", "true") //自动推断数据类型
      .csv("D:\\每日总结\\视频\\spark\\spark-day10\\资料\\login.csv")

    //使用DSL风格的,需要先导入这两个隐式转换
    import sparkSession.implicits._
    import org.apache.spark.sql.functions._

    //去重
    dataFrame.distinct()
      .select('uid,$"dt",
        row_number() over(Window.partitionBy('uid).orderBy('dt)) as 'row_num
      ).select('uid,$"dt",
      date_sub('dt,'row_num) as 'dis_date
    ).groupBy('uid,'dis_date)
      .agg(min('dt),max('dt), count('*) as 'count_days )
      .where('count_days >= 3).show()

    sparkSession.stop()
  }
}

+------+----------+----------+----------+----------+
|   uid|  dis_date|   min(dt)|   max(dt)|count_days|
+------+----------+----------+----------+----------+
|guid02|2018-02-28|2018-03-01|2018-03-03|         3|
|guid01|2018-02-27|2018-02-28|2018-03-02|         3|
|guid01|2018-02-28|2018-03-04|2018-03-07|         4|
+------+----------+----------+----------+----------+

流量统计案例:

数据
1,2020-02-18 14:20:30,2020-02-18 14:46:30,20
1,2020-02-18 14:47:20,2020-02-18 15:20:30,30
1,2020-02-18 15:37:23,2020-02-18 16:05:26,40
1,2020-02-18 16:06:27,2020-02-18 17:20:49,50
1,2020-02-18 17:21:50,2020-02-18 18:03:27,60
2,2020-02-18 14:18:24,2020-02-18 15:01:40,20
2,2020-02-18 15:20:49,2020-02-18 15:30:24,30
2,2020-02-18 16:01:23,2020-02-18 16:40:32,40
2,2020-02-18 16:44:56,2020-02-18 17:40:52,50
3,2020-02-18 14:39:58,2020-02-18 15:35:53,20
3,2020-02-18 15:36:39,2020-02-18 15:24:54,30

sql代码实现

package com.doit.spark.day10

import org.apache.spark.sql.{DataFrame, SparkSession}


object FowRollupSQL {
  def main(args: Array[String]): Unit = {

    val spark = SparkSession.builder().appName(this.getClass.getSimpleName).master("local[*]").getOrCreate()

    val df: DataFrame = spark.read.option("header", "true").format("csv").load("D:\\每日总结\\视频\\spark\\spark-day06\\资料\\data.csv")

    //注册视图
    df.createTempView("v_user_flow")

    spark.sql(
      s"""
         |
         |SELECT
         |  uid,MIN(start_time),MAX(end_time),SUM(flow)
         |FROM
         |(
         |  SELECT
         |    uid,start_time,end_time,flow,
         |    SUM(num) OVER(PARTITION BY uid ORDER BY start_time) as sum_num  --在窗口内将给的数字加总,从而分开每个阶段
         |  FROM
         |  (
         |    SELECT
         |      uid,start_time,end_time,flow,
         |      IF((UNIX_TIMESTAMP(start_time)-UNIX_TIMESTAMP(lag_time))/60 >10 ,1,0) AS num  --判断时间差是否大于10分钟,大于就给1,小于就给0
         |    FROM
         |    (
         |      SELECT
         |        uid,start_time,end_time,flow,
         |        LAG(end_time,1,start_time) OVER(PARTITION BY uid ORDER BY start_time) as lag_time--将end_time往下压一行,第一行为null时,将start_time的值给它
         |      FROM
         |        v_user_flow
         |    )
         |  )
         |)GROUP BY uid,sum_num
         |
         |
         |
         |""".stripMargin).show()
  }
}

DSL风格代码实现

package com.doit.spark.day10

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.{DataFrame, SparkSession}


object FowRollupSQL {
  def main(args: Array[String]): Unit = {

    val spark = SparkSession.builder().appName(this.getClass.getSimpleName).master("local[*]").getOrCreate()

    val df: DataFrame = spark.read.option("header", "true").format("csv").load("D:\\每日总结\\视频\\spark\\spark-day06\\资料\\data.csv")

    import spark.implicits._
    import org.apache.spark.sql.functions._

    df.select('uid, 'start_time,'end_time,'flow,
      expr("lag(end_time,1,start_time)") over(Window.partitionBy('uid).orderBy('start_time)) as 'lag_time
      //表达式expr中可以放入SQL的一个片段
    ).select('uid, 'start_time,'end_time,'flow,
      expr("if ((unix_timestamp(start_time)-unix_timestamp(lag_time))/60 > 10 ,1,0)") as 'num
    ).select('uid, 'start_time,'end_time,'flow,
      sum('num) over(Window.partitionBy('uid).orderBy('start_time)) as 'sum_num
    ).groupBy('uid,'sum_num).agg(
    min('start_time) as 'min_time,max('end_time) as 'max_time,sum('flow) as 'sum_flow
    ).select(
      'uid,'min_time,'max_time,'sum_flow
    ).show()
  }
}

+---+-------------------+-------------------+--------+
|uid|           min_time|           max_time|sum_flow|
+---+-------------------+-------------------+--------+
|  3|2020-02-18 14:39:58|2020-02-18 15:35:53|    50.0|
|  1|2020-02-18 14:20:30|2020-02-18 15:20:30|    50.0|
|  1|2020-02-18 15:37:23|2020-02-18 18:03:27|   150.0|
|  2|2020-02-18 14:18:24|2020-02-18 15:01:40|    20.0|
|  2|2020-02-18 15:20:49|2020-02-18 15:30:24|    30.0|
|  2|2020-02-18 16:01:23|2020-02-18 17:40:52|    90.0|
+---+-------------------+-------------------+--------+
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
手把手视频详细讲解项目开发全过程,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 课程简介 知识点介绍、代码演示、逻辑分析、灵活举例、使用图形的方式详细演示代码的流程和细节、整合企业级实战案例,全面讲解并突出重点,让学习也变成一种快乐。 课程亮点 1,知识体系完备,阶段学习者都能学有所获。 2,综合各种方式演示代码、分析逻辑,生动形象,化繁为简,讲解通俗易懂。 3,结合工作实践及分析应用,培养解决实际问题的能力。 4,使用综合案例来加强重点知识,用切实的应用场景提升编程能力,充分巩固各个知识点的应用。 5,整个课程的讲解思路是先提出问题,然后分析问题,并编程解决解题。 适用人群 1、对大数据感兴趣的在校生及应届毕业生。 2、对目前职业有进一步提升要求,希望从事大数据行业高薪工作的在职人员。 3、对大数据行业感兴趣的相关人员。 课程内容 第一章、Spark 基础环境 1.课程安排说明 2.Spark 框架概述 3.快速入门 4.Standalone集群及HA 5.Spark 应用开发入门 6.Spark 应用提交 7.Spark on YARN 8.应用部署模式DeployMode 第二章、SparkCore 模块 1.RDD 概念及特性 2.RDD 创建 3.RDD 函数及使用 4.RDD 持久化 5.案例:SogouQ日志分析 6.RDD Checkpoint 7.外部数据源(HBase和MySQL) 8.广播变量和累加器 9.Spark 内核调度 10.Spark 并行度 第三章、SparkSQL 模块 1.快速入门:词频统计 2.SparkSQL 概述 3.DataFrame 4.RDD与DataFrame转换 5.数据分析SQL和DSL 6.案例:电影评分数据分析 7.DataSet 8.外部数据源Exeternal DataSource 9.集成Hive 10.自定义函数UDF 11.分布式SQL引擎(spakr-sqlSpark ThriftServer) 12.Catalyst 优化器 第四章、离线综合实战 1.综合实战概述(需求、调研、业务) 2.环境搭建(大数据环境和应用开发环境) 3.项目初始化(工具类和属性文件) 4.广告数据ETL 5.Spark 分布式缓存 6.业务报表分析 7.应用执行部署 8.Oozie和Hue集成调度Spark 应用 第五章、SparkStreaming 模块 1.Streaming流式应用概述 2.Streaming 计算模式 3.SparkStreaming计算思路 4.入门案例 5.SparkStreaming工作原理 6.DStream及函数 7.集成Kafka 8.案例:百度搜索风云榜(实时ELT、窗口Window和状态State) 9.SparkStreaming Checkpoint 10.消费Kafka偏移量管理 第六章、StructuredStreaming模块 1.StructuredStreaming 概述(核心设计和编程模型) 2.入门案例:WordCount 3.输入源InputSources 4.Streaming Query 设置 5.输出终端OutputSink 6.集成Kafka(Source和Sink) 7.案例:物联网设备数据分析 8.事件时间窗口分析 9.Streaming Deduplication数据去重 10.Continues Processing连续流处理 第七章、实时综合实战 1.综合实战概述(需求、环境搭建和项目初始化) 2.模拟交易订单数据 3.数据实时ETL存储Kafka 4.实时应用停止 5.实时增量存储(存储HBase和Elasticsearch) 6.实时订单报表(Kafka-StructuredStreaming-Redis) 7.实时应用性能调优(数据本地性、反压机制、动态资源和日志管理)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值