如何合并两个不同类型的流RDD

时间:2016-04-14 08:59:15

标签: scala apache-spark stream rdd

我需要合并两个不同的流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)

1 个答案:

答案 0 :(得分:2)

问题是union仅适用于同一元素类型的两个DStream,而DStream[String]DStream[twitter4j.Status]String不是twitter4j.Status {1}}。

我假设您有以下类型:

val stream: DStream[twitter4j.Status]
val sentiments: DStream[String]

您有不同的选择来解决此问题:

    1. 您确定Stringtwitter4j.Status应合并为一个DStream,因为它们代表您上下文中的相同信息:将DStream转换为匹配另一个

      • a)将stream转换为匹配sentiments,因此您需要转化twitter4j.Status => String,可能您可以像这样使用_.toString

        val stream2 = stream.map(_.toString)
        val result = stream2.union(sentiments)
        
      • b)将sentiments转换为匹配stream,需要String => twitter4j.Status
    1. Stringtwitter4j.Status在您的上下文中是两个不同的东西,您希望保持两者之间的区别,但仍将它们合并为一个DStream
    2. 一般情况下,您可以使用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包裹在Lefttwitter4j.Status包裹在{{} 1}},允许您在处理流时区分两者。