簡體   English   中英

如何在 spark 結構化流查詢(Kafka)之后調用方法?

[英]How to call a method after a spark structured streaming query (Kafka)?

我需要根據從主題收到的值執行一些功能。 我目前正在使用 ForeachWriter 將所有主題轉換為列表。 現在,我想將此列表作為參數傳遞給方法。

這是我到目前為止所擁有的

def doA(mylist: List[String]) = { //something for A }
def doB(mylist: List[String]) = { //something for B }

Ans 這就是我調用流媒體查詢的方式

//{"s":"a","v":"2"}
//{"s":"b","v":"3"}
val readTopics = spark.readStream.format("kafka").option("kafka.bootstrap.servers", "localhost:9092").option("subscribe", "myTopic").load()

val schema = new StructType()
      .add("s",StringType)
      .add("v",StringType)
      
val parseStringDF = readTopics.selectExpr("CAST(value AS STRING)")

val parseDF = parseStringDF.select(from_json(col("value"), schema).as("data"))
   .select("data.*")

parseDF.writeStream
  .format("console")
  .outputMode("append")
  .start()

//fails here
val listOfTopics = parseDF.select("s").map(row => (row.getString(0))).collect.toList

//unable to call the below methods
for (t <- listOfTopics ){
    if(t == "a")
        doA(listOfTopics)
    else if (t == "b")
        doB(listOfTopics)
    else
        println("do nothing")
}

spark.streams.awaitAnyTermination() 

問題:

  1. 如何在流式作業中調用獨立(非流式)方法?
  2. 我不能在這里使用 ForeachWriter,因為我想將 SparkSession 傳遞給方法,並且由於 SparkSession 不可序列化,所以我不能使用 ForeachWriter。 並行調用方法 doA 和 doB 的替代方法是什么?

如果您希望能夠將數據收集到本地 Spark 驅動程序/執行程序,則需要使用parseDF.write.foreachBatch ,即使用ForEachWriter

目前還不清楚在你的兩種方法中你需要 SparkSession 做什么,但由於它們正在處理非 Spark 數據類型,你可能不應該使用 SparkSession 實例,無論如何

或者,您應該.select()並過濾您的主題列,然后將這些函數應用於兩個“topic-a”和“topic-b”數據框,從而並行化工作負載。 否則,您最好只使用來自kafka-clientskafka-streams的常規KafkaConsumer而不是 Spark

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM