我需要合并两个不同的流RDD。
uno of streams类型是org.apache.spark.streaming.dstream.DStream [String],另一个是org.apache.spark.streaming.dstream.DStream类型[twitter4j.Status]。
我试过了:
find "$BDIR" -type d -mtime +180 -print0 | xargs -0 -r rm -rf
但它没有成功:
val streamRDD = stream.union(sentiments)
答案 0 :(得分:2)
问题是union
仅适用于同一元素类型的两个DStream
,而DStream[String]
和DStream[twitter4j.Status]
和String
不是twitter4j.Status
{1}}。
我假设您有以下类型:
val stream: DStream[twitter4j.Status]
val sentiments: DStream[String]
您有不同的选择来解决此问题:
您确定String
和twitter4j.Status
应合并为一个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
- 类型来表示每种情况,此处我们只有两种,因此我们可以使用预定义的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)
最后,您将拥有一个流,其中每个元素都是String
包裹在Left
或twitter4j.Status
包裹在{{} 1}},允许您在处理流时区分两者。