Spark Streaming算子操作

本文介绍了Spark Streaming的转换算子,重点讲解了updateStateByKey和mapWithState的区别,以及状态数据如何通过checkpoint机制进行持久化,以确保流处理应用在异常中止后的故障恢复。foreachRDD操作用于将DStream内容写入外部存储,例如RDBMS。
摘要由CSDN通过智能技术生成

Spark Streaming算子操作

转换算子

类似于RDD,DStream允许进行相应的转换操作,并且大多数的转换操作类似于RDD

import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.streaming.{
   Seconds, StreamingContext}

/**
  * spark streaming的转换操作
  *
  * 父DStream --> 子DStream
  */
object TransformationsTest {
   
  def main(args: Array[String]): Unit = {
   
    //1. 初始化streaming context
    val conf = new SparkConf().setMaster("local[*]").setAppName("transformations test")

    val ssc = new StreamingContext(conf, Seconds(5))

    ssc.sparkContext.setLogLevel("ERROR")

    //2. 构建source dstream

    val ds = ssc.socketTextStream("SparkOnStandalone", 9999);
    //3. 应用转换操作
    //--------------------------------------------------------------------------
    //    ds
    //      .flatMap(_.split(" ")) // 将line --> word
    //      .map((_, 1)) // word ---> (word,1)
    //      .filter(t2 => t2._1.startsWith("H")) // 保留DStream中以H开头的所有单词
    //      .repartition(5) // 将数据分为5个分区
    //      .print()
    //--------------------------------------------------------------------------


    //--------------------------------------------------------------------------
    // union 将两个DStream组合在一起返回一个新的DStream
    //    val ds1 = ssc.socketTextStream("SparkOnStandalone", 9999);
    //    val ds2 = ssc.socketTextStream("SparkOnStandalone", 8888);
    //    ds1
    //      .union(ds2)
    //      .print()

    //--------------------------------------------------------------------------

    //--------------------------------------------------------------------------
    // 返回微批RDD中元素的数量
    //    val ds3 = ssc.socketTextStream("SparkOnStandalone", 9999);
    //    ds3
    //      .count()
    //      .print()
    //--------------------------------------------------------------------------

    //--------------------------------------------------------------------------
    // reduce 对DStream每一个元素应用函数进行计算
    //    val ds4 = ssc.socketTextStream("SparkOnStandalone", 9999);
    //
    //    ds4
    //      .flatMap(_.split(" "))
    //      .map(strNum => strNum.toInt)
    //      .reduce((v1, v2) => v1 + v2) // 1 2 3 4 5
    //      .print()
    //--------------------------------------------------------------------------

    //--------------------------------------------------------------------------
    // countByValue  对DStream调用 返回DStream相同元素k的出现count (k,count)
    //    val ds6 = ssc.socketTextStream("SparkOnStandalone", 9999);
    //    ds6
    //      .flatMap(_.split(" "))   // Hello Hello Spark
    //      .countByValue(2)   // (Hello,2)
    //                                      // (Spark,1)
    //      .print()
    //--------------------------------------------------------------------------

    //--------------------------------------------------------------------------
    // reduceByKey 根据key应用计算函数
    //    val ds7 = ssc.socketTextStream("SparkOnStandalone", 9999);
    //    ds7
    //      .flatMap(_.split(" "))
    //      .map((_, 1))
    //      .reduceByKey(_ - _)
    //      .print()
    //--------------------------------------------------------------------------

    //--------------------------------------------------------------------------
    // join 两个DStream进行连接操作 【意义不大】  流 + 批 join
    //    val ds8 = ssc.socketTextStream("SparkOnStandalone", 9999).map((_, 1));  // (a,1)
    //    val ds9 = ssc.socketTextStream("SparkOnStandalone", 8888).map((_, 1));  // (a,1)
    //    ds8
    //      .join(ds9)  // (a,(1,1))  内连接
    //      .print()

    //--------------------------------------------------------------------------

    //--------------------------------------------------------------------------
    // cogroup
    //    val ds10 = ssc.socketTextStream("SparkOnStandalone", 9999).map((_, 1)); // (a,1)
    //    val ds11 = ssc.socketTextStream("SparkOnStandalone", 8888).map((_, 1)); // (a,1)
    //    ds10
    //      .cogroup(ds11) // (a,([1],[1]))  官方文档有误
    //      .print()
    //-----------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值