Spark-Streaming

找出所有有效数据,要求电话号码为11位,但只要列中没有空值就算有效数据。
按地址分类,输出条数最多的前20个地址及其数据。
代码讲解:

导包和声明对象,设置Spark配置对象和SparkContext对象。
使用Spark SQL语言进行数据处理,包括创建数据库、数据表,导入数据文件,进行数据转换。
筛选有效数据并存储到新表中。
按地址分组并统计出现次数,排序并输出前20个地址。

代码如下

import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession

object Demo {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Demo")
    val spark = SparkSession.builder().enableHiveSupport()
      .config("spark.sql.warehouse.dir", "hdfs://node01:9000/user/hive/warehouse").config(sparkConf).getOrCreate()

    spark.sql(sqlText = "create database spark_sql_2")
    spark.sql(sqlText = "use spark_sql_2")
    //创建存放原始数据的表
    spark.sql(
      """
        |create table user_login_info(data string
        |row format delimited
        |""".stripMargin)
    spark.sql(sqlText = "load data local inpath 'Spark-SQL/input/user_login_info.json' into table user_login_info")
    //利用get_json_object将数据做转换
    spark.sql(
      """
        |create table user_login_info_1
        |as
        |select get_json_object(data,'$.uid') as uid,
        |get_json_object(data,'$.phone') as phone,
        |get_json_object(data,'$.addr') as addr from user_login_info
        |""".stripMargin)
    spark.sql(sqlText = "select count(*) count from user_login_info_1").show()
    //获取有效数据
    spark.sql(
      """
        |create table user_login_info_2
        |as
        |select * from user_login_info_1
        |where uid != ' ' and phone != ' ' and addr != ' '
        |""".stripMargin)
    spark.sql(sqlText = "select count(*) count from user_login_info_2").show()
    //获取前20个地址
    spark.sql(
      """
        |create table hot_addr
        |as
        |select addr,count(addr) count from user_login_info_2
        |group by addr order by count desc limit 20
        |""".stripMargin)
    spark.sql(sqlText = "select * from hot_addr").show()
    spark.stop()
  }
  }


Spark Streaming介绍
Spark Streaming概述:

用于流式计算,处理实时数据流。
支持多种数据输入源(如Kafka、Flume、Twitter、TCP套接字等)和输出存储位置(如HDFS、数据库等)。
Spark Streaming特点:

易用性:支持Java、Python、Scala等编程语言,编写实时计算程序如同编写批处理程序。
容错性:无需额外代码和配置即可恢复丢失的数据,确保实时计算的可靠性。
整合性:可以在Spark上运行,允许重复使用相关代码进行批处理,实现交互式查询操作。
Spark Streaming架构:

驱动程序(StreamingContext)处理数据并传给SparkContext。
工作节点接收和处理数据,执行任务并备份数据到其他节点。
背压机制协调数据接收能力和资源处理能力,避免数据堆积和资源浪费。
Spark Streaming实操
词频统计案例:

使用ipad工具向999端口发送数据,Spark Streaming读取端口数据并统计单词出现次数。
代码配置包括设置关键对象、接收TCP套接字数据、扁平化处理、累加相同键值对、分组统计词频。
启动和运行:

启动netpad发送数据,Spark Streaming每隔三秒收集和处理数据。
代码中没有显式关闭状态,流式计算默认持续运行,确保数据处理不间断。
DStream创建
DStream创建方式:

RDD队列:通过SSC创建RDD队列,将RDD推送到队列中作为DStream处理。
自定义数据源:下节课详细讲解。
RDD队列案例:

循环创建多个RDD并推送到队列中,使用Spark Streaming处理RDD队列进行词频统计。
代码包括配置对象、创建可变队列、转换RDD为DStream、累加和分组统计词频。
代码如下

import org.apache.spark.SparkConf

object WordCount {
  def main(args: Array[String]): Unit = {
      val sparkConf = new SparkConf().setMaster("local[*]").setAppName("streaming")
      val ssc = new StreamingContext(sparkConf,Seconds(3))

    val lineStreams = ssc.socketTextStream("node01",9999)
    val wordStreams = lineStreams.flatMap(_.split(" "))
    val wordAndOneStreams = wordStreams.map((_,1))
    val wordAndCountStreams = wordAndOneStreams.reduceByKey(_+_)
    wordAndCountStreams.print()

    ssc.start()
    ssc.awaitTermination()

  }

}


结果展示:


展示了词频统计的结果,验证了Spark Streaming的正确性和有效性。

自定义数据源的实现

需要导入新的函数并继承现有的函数。
创建数据源时需选择class而不是object。
在class中定义on start和on stop方法,并在这些方法中实现具体的功能。
类的定义和初始化

类的定义包括数据类型的设定,如端口号和TCP名称。
使用extends关键字继承父类的方法。
数据存储类型设定为内存中保存。
数据接收和处理

在on start方法中创建新线程并调用接收数据的方法。
连接到指定的主机和端口号,创建输入流并转换为字符流。
逐行读取数据并写入到spark stream中,进行词频统计。
数据扁平化和词频统计

使用block map进行数据扁平化处理。
将原始数据转换为键值对形式,并根据相同键进行分组和累加。
输出词频统计结果。
程序终止条件

设定手动终止和程序异常时的终止条件。
在满足终止条件时输出结果并终止程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值