簡體   English   中英

閱讀多個主題並寫入單個主題-Spark Streaming

[英]Read from multiple topics and write to single topic - Spark Streaming

如何使用具有不同架構的spark readStream()從多個主題讀取內容,以及如何使用Spark StructedSchemawriteStream()寫入單個主題。

注意:每個輸入主題具有不同的架構

如何使用具有不同架構的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.

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