Apache spark 如何将两者都包括在内;最新;及;带有特定偏移量的JSON;在;“启动补偿”;将数据从Kafka导入Spark结构化流媒体时

Apache spark 如何将两者都包括在内;最新;及;带有特定偏移量的JSON;在;“启动补偿”;将数据从Kafka导入Spark结构化流媒体时,apache-spark,apache-kafka,spark-structured-streaming,Apache Spark,Apache Kafka,Spark Structured Streaming,我有一个将数据保存到FileLink的流式查询。我正在使用.option(“startingoffset”、“latest”)和一个检查点位置。如果Spark上有任何停机时间,并且当流式查询再次启动时,我不希望在查询停止时开始处理,而不是在这种情况下,我还希望通过指定需要从中处理的用户定义的偏移量来添加(“StartingOffset”,“topicA”:{“0”:23,“1”:-1},“topicB”:{“0”:-2}”) 我试着用不同的程序来实现这一点,但我需要在一个程序中实现这一点 imp

我有一个将数据保存到FileLink的流式查询。我正在使用.option(“startingoffset”、“latest”)和一个检查点位置。如果Spark上有任何停机时间,并且当流式查询再次启动时,我不希望在查询停止时开始处理,而不是在这种情况下,我还希望通过指定需要从中处理的用户定义的偏移量来添加(“StartingOffset”,“topicA”:{“0”:23,“1”:-1},“topicB”:{“0”:-2}”)

我试着用不同的程序来实现这一点,但我需要在一个程序中实现这一点

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
import org.apache.spark.sql.streaming.Trigger

object OSB_offset_kafkaToSpark {

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

    val spark = SparkSession.
      builder().
      appName("OSB_kafkaToSpark").
      config("spark.mongodb.output.uri", "spark.mongodb.output.uri=mongodb://somemongodb.com:27018").
      getOrCreate()

    println("SparkSession -> "+spark)

    import spark.implicits._

    val df = spark
      .readStream
      .format("kafka")
      .option("kafka.bootstrap.servers", "somekafkabroker:9092, somekafkabroker:9092")
      .option("subscribe", "someTopic")
      .option("startingOffsets", "latest")
      .option("startingOffsets",""" {"someTopic":{"0":438521}}, "someTopic":{"1":438705}}, "someTopic":{"2":254180}}""")
      .option("endingOffsets",""" {"someTopic":{"0":-1}}, "someTopic":{"1":-1}}, "someTopic":{"2":-1}} """)
      .option("failOnDataLoss", "false")
      .load()
    val dfs = df.selectExpr("CAST(value AS STRING)")

    val data = dfs.withColumn("splitted", split($"value", "/"))
      .select($"splitted".getItem(4).alias("region"), $"splitted".getItem(5).alias("service"), col("value"))
      .withColumn("service_type", regexp_extract($"service", """.*(Inbound|Outbound|Outound).*""", 1))
      .withColumn("region_type", concat(
        when(col("region").isNotNull, col("region")).otherwise(lit("null")), lit(" "),
        when(col("service").isNotNull, col("service_type")).otherwise(lit("null"))))
      .withColumn("datetime", regexp_extract($"value", """\d{4}-[01]\d-[0-3]\d [0-2]\d:[0-5]\d:[0-5]\d""", 0))

    val extractedDF = data.filter(
      col("region").isNotNull &&
        col("service").isNotNull &&
        col("value").isNotNull &&
        col("service_type").isNotNull &&
        col("region_type").isNotNull &&
        col("datetime").isNotNull)
      .filter("region != ''")
      .filter("service != ''")
      .filter("value != ''")
      .filter("service_type != ''")
      .filter("region_type != ''")
      .filter("datetime != ''")

    val pathstring = "/user/spark_streaming".concat(args(0))


    val query = extractedDF.writeStream
      .format("json")
      .option("path", pathstring)
      .option("checkpointLocation", "/user/some_checkpoint")
      .outputMode("append")
      .trigger(Trigger.ProcessingTime("5 seconds"))
      .start()

    query.awaitTermination()

  }
}
我需要使用.option(“StartingOffset”,“latest”)和.option(“StartingOffset”,“someTopic”:{“0”:438521}},“someTopic”:{“1”:438705}},“someTopic”:{“2”:254180}}”)

我不确定这是否可以实现