[英]Spark Structure Streaming not able to read message from Kafka topics
[英]Read from multiple topics and write to single topic - Spark Streaming
如何使用具有不同架構的spark readStream()
從多個主題讀取內容,以及如何使用Spark StructedSchema
將writeStream()
寫入單個主題。
注意:每個輸入主題具有不同的架構
如何使用具有不同架構的spark readStream()從多個主題中讀取內容,以及如何使用Spark StructedSchema從writeStream()到單個主題中讀取內容?
我在這里給出一般性的想法或指導.....可能適合您的情況。
我假設您使用的是Avro消息,有2個主題,一個主題是消息,另一個主題是架構,我將其稱為消息主題和架構主題。
現在,准備一個通用的行包裝器架構,例如avro_yourrow_wrapper.avsc
,該架構包含不同的架構消息(因為您告訴每條消息具有不同的架構)。
例如:根據您的要求修改此樣本。
{
"type" : "record",
"name" : "generic_schema",
"namespace" : "yournamespace",
"fields" : [ {
"name" : "messagenameOrTableNames",
"type" : "string"
}, {
"name" : "schema",
"type" : "long"
}, {
"name" : "payload",
"type" : "bytes"
} ]
}
將其保存到名為avro_yourrow_wrapper.avsc的文件,因為其靜態...
// Read the wrapper schema in your consumer.
val inputStream = getClass.getResourceAsStream("avro_yourrow_wrapper.avsc")
val source = scala.io.Source.fromInputStream(inputStream)
val wrapperSchema = try source.mkString finally source.close()
從spark結構化流中,您將獲得一個數據框。 根據消息類型讀取包裝器模式,通過讀取模式主題和消息主題讀取avro消息,應用記錄特定的模式。
現在,使用twitter bijection api(帶有GenericRecord
),您可以將消息解碼為可讀格式。
樣本偽代碼段:
import com.twitter.bijection.Injection
import com.twitter.bijection.avro.GenericAvroCodecs
import org.apache.avro.generic.GenericRecord
val schema = new Schema.Parser().parse(localschema.get( recordlevelschema).get)
val recordInjection: Injection[GenericRecord, Array[Byte]] = GenericAvroCodecs.toBinary(schema)
val record: GenericRecord = recordInjection.invert(bytes).get
log.info("record.getSchema" +record.getSchema)
record.getSchema.getFields.toArray().foreach(x =>log.info(x.toString))
然后,您可以根據需要編寫單獨的主題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.