[英]How to merge two different type streams RDDs
我需要合並兩個不同的流RDD。
流類型的Uno是org.apache.spark.streaming.dstream.DStream [String],另一個是org.apache.spark.streaming.dstream.DStream [twitter4j.Status]類型。
我試過了:
val streamRDD = stream.union(sentiments)
但這不會成功:
[error] found : org.apache.spark.streaming.dstream.DStream[String]
[error] required: org.apache.spark.streaming.dstream.DStream[twitter4j.Status]
[error] val streamRDD = stream.union(sentiments)
[error] ^
問題是, union
僅適用於相同元素類型的兩個DStream
,而您具有DStream[String]
和DStream[twitter4j.Status]
而String
不是twitter4j.Status
。
我假設您具有以下類型:
val stream: DStream[twitter4j.Status]
val sentiments: DStream[String]
您有不同的選擇來解決此問題:
您確定應該將String
和twitter4j.Status
混合到一個DStream
因為它們在您的上下文中表示相同的信息:將任一DStream
轉換為與另一個DStream
匹配
a)轉換stream
以匹配sentiments
,因此您需要轉換twitter4j.Status => String
,可能可以使用_.toString
如下所示:
val stream2 = stream.map(_.toString) val result = stream2.union(sentiments)
sentiments
以匹配stream
,要求String => twitter4j.Status
。 String
和twitter4j.Status
在您的上下文中是兩個不同的事物,您想保持兩者之間的區別,但仍將它們組合為一個DStream
通常,您可以使用Sum
-type表示每種情況,這里只有兩種,所以我們可以使用預定義的Either
:
type R = DStream[Either[String,twitter4j.Status] // shorter val streamL: R = stream.map(Left(_)) val sentimentR: R = sentiments.map(Right(_)) val result: R = streamL.union(sentimentsR)
最后,您將獲得一個流,其中每個元素可以是包裹在Left
的String
或包裹在Right
的twitter4j.Status
,從而可以在處理流時區分兩者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.