structure streaming 使用小结3-输出模式(append,update,complete)

常规使用不提,主要是使用不同模式完成排序,数据更新操作,算是对小结2的补充优化。

1、排序,使用complete模式,将数据流看做静态表,不断追加数据,通过order by可以实现排序功能。

val df =spark.readStream
      .format("kafka")
      .option("kafka.bootstrap.servers", "*:9092")
//      .option("kafka.bootstrap.servers", "*:9092")
      .option("subscribe", "test")
      .option("startingOffsets", "latest")
      .load()
      .selectExpr("CAST(value AS STRING)")
      .as[String]
      .filter(line => line.split(",").length > 2)
//      //        .dropDuplicates()
      .map(line => {
      val mes = line.split(",")
      val provincial_centre_id = mes(0).toInt
      val terminal_id =  mes(1).toLong
      val timestamp = mes(2).toLong
      val value = mes(3).toInt
      val time = MyUtils.getSqlTimes(timestamp)

      (provincial_centre_id,terminal_id,timestamp,value,time)
    })
      .toDF("provincial_centre_id","terminal_id","timestamp","value","time")
      .selectExpr("provincial_centre_id","terminal_id" ,"timestamp","value","time")
      .withWatermark("time","10 seconds")
//      .groupBy("time","provincial_centre_id","terminal_id","timestamp","value").count()
//      .repartition(100,new Column("terminal_id"))
      .createOrReplaceTempView("t_odscb_sales")
//    spark.sql("select * from b_mapping_siteclerk limit 3").show()
    println("=====================>2")

//    val sql_sale = "select terminal_id,max(provincial_centre_id) as provincial_centre_id," +
//      " max(timestamp) as timestamp,1 as value,max(time) as time ,count(1)" +
//      "  from t_odscb_sales  " +
//      " group by terminal_id " +
//      "   "
    val sql_sale = "select terminal_id,provincial_centre_id," +
      " timestamp,time ,count(1)" +
      "  from t_odscb_sales  " +
      " group by terminal_id,provincial_centre_id,timestamp,time" +
  " order by timestamp " +
      "   "
//    //      println(sql_sale)
    val df1 = spark.sql(sql_sale)
//    val query1 = df
      .writeStream
      .outputMode("complete")
//      .foreach(new Test)

      .format("console")
      .option("checkpointLocation", directory1)
      .start()
    println("=====================>3")
    spark.streams.awaitAnyTermination()

排序结果,好用

 

官网说配合withWatermark实现数据过期处理,通过实验,结果失败,数据不能过期,随着数据量增大,表的数据会很大。如何配合使用,有待后续继续研究。( .withWatermark("time","10 seconds")无效)

 

2、update模式配合max聚合,不支持排序order by。进行计数统计,使用 .withWatermark("time","10 seconds")无效。

 

 去重可用,.dropDuplicates("timestamp")

 

去重加时间范围。去重可用, withWatermark("time","10 seconds")无效。

 

去重加sql语句的时间控制进行数据处理

.dropDuplicates("timestamp")
" where   timestamp >= unix_timestamp()-60 " +

3、append

.withWatermark("time","10 seconds")延迟一个批次显示

使用聚合函数需要配合

.withWatermark("time","10 seconds")使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark Structured Streaming 中的 AppendComplete、Update 三种输出模式与前面所提到的 AI 对话系统中的输出模式有类似之处,但是在具体实现和使用上有所不同。 1. Append 模式:该模式下,只有新增的数据才会被输出,已有数据不会被更新。在这种模式下,输出结果只包含新的数据,不包含历史数据。该模式适用于数据不需要更新的场景,比如说对于一组计算的结果,每次只需要使用最新的结果即可。 2. Complete 模式:该模式下,所有的数据都会被输出,而且输出结果会包含历史数据和新数据的计算结果。在这种模式下,Spark会全部计算完所有数据后进行输出。该模式适用于需要输出完整结果的场景,比如说需要输出各个时间段的交易总额。 3. Update 模式:该模式下,只有更新的数据会被输出,历史数据不会被输出。在这种模式下,Spark会在每个批次之间进行数据的增量计算,并且只输出新增的和修改过的数据。该模式适用于需要实时更新结果的场景,比如说需要实时监控某个指标的变化。 总的来说,三种模式各有优缺点,可以根据具体的场景和需求来选择使用Append 模式适用于数据无需更新的情况,Complete 模式适用于需要输出完整结果的场景,Update 模式适用于需要实时监控变化的场景。同时,不同的输出模式对计算性能和资源消耗也有所不同,需要综合考虑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值