![](/img/trans.png)
[英]How to create a new column for dataset using “.withColumn” with many conditions in Scala Spark
[英]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.