![](/img/trans.png)
[英]How to apply Spark schema to the query based on Kafka topic name in Spark Structured Streaming?
[英]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()
問題:
如果您希望能夠將數據收集到本地 Spark 驅動程序/執行程序,則需要使用parseDF.write.foreachBatch
,即使用ForEachWriter
目前還不清楚在你的兩種方法中你需要 SparkSession 做什么,但由於它們正在處理非 Spark 數據類型,你可能不應該使用 SparkSession 實例,無論如何
或者,您應該.select()
並過濾您的主題列,然后將這些函數應用於兩個“topic-a”和“topic-b”數據框,從而並行化工作負載。 否則,您最好只使用來自kafka-clients
或kafka-streams
的常規KafkaConsumer
而不是 Spark
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.