簡體   English   中英

轉換不是1:1而是1:多時如何創建Spark DataSet

[英]How to create a Spark DataSet when the transformation is not 1:1, but 1:many

我正在編寫一個結構化的流式 Spark 應用程序,我正在從 Kafka 隊列中讀取數據並處理收到的消息。 我想要的最終結果是一個DataSet[MyMessage] (其中MyMessage是一個自定義對象),我想將其排隊到另一個 Kafka 主題。 問題是,來自消費者 Kafka 隊列的每條輸入消息都可以產生多個MyMessage對象,因此轉換不是 1:1、1:Many。

所以我在做

val messagesDataSet: DataSet[List[MyMessage]] = spark.readStream
      .format("kafka")
      .option("kafka.bootstrap.servers", "server1")
      .option("subscribe", "topic1")
      .option("failOnDataLoss", false)
      .option("startingOffsets", "offset1")
      .load()
      .select($"value")
      .mapPartitions{r => createMessages(r)}

val createMessages(row: Iterator[Row]): List[MyMessage] = {
   // ...
}

顯然, messagesDataSet是一個DataSet[List[MyMessage]] 有沒有辦法只得到一個DataSet[MyMessage]

或者有沒有辦法獲取DataSet[List[MyMessage]]然后將每個MyMessage對象寫入另一個 Kafka 主題? (畢竟這是我的最終目標)

您可以使用 mapPartitions 創建多個值(因此它的工作方式類似於 flatMap),但您必須返回 Iterator:

  def createMessages(row: Iterator[Row]): Iterator[MyMessage] = {
    row.map(/*...*/) //you need too return iterator here
  }

嘗試

messagesDataSet.flatMap(identity)

暫無
暫無

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

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