将输入流转换为键值对流

时间:2015-05-19 16:00:07

标签: scala apache-spark spark-streaming

我是Spark和Scala的新手,所以我的问题可能很容易,但我仍然很难找到答案。我需要加入两个Spark流,但是我将这些流转换为适当的格式时遇到了问题。请参阅下面的代码:

val lines7 = ssc.socketTextStream("localhost", 9997)
val pairs7 = lines7.map(line => (line.split(" ")[0], line))

val lines8 = ssc.socketTextStream("localhost", 9998)
val pairs8 = lines8.map(line => (line.split(" ")[0], line))

val newStream = pairs7.join(pairs8)

这不起作用,因为“join”函数需要格式为DStream[String, String]的流,而map函数的结果为DStream[(String, String)]

现在我的问题是如何编写这个地图函数以获得适当的输出(很少解释也很棒)?

提前致谢。

1 个答案:

答案 0 :(得分:1)

这可以按预期工作:

import org.apache.spark.streaming.{Seconds, StreamingContext}

val ssc = new StreamingContext(sc, Seconds(30))
val lines7 = ssc.socketTextStream("localhost", 9997)
val pairs7 = lines7.map(line => (line.split(" ")(0), line))
val lines8 = ssc.socketTextStream("localhost", 9998)
val pairs8 = lines8.map(line => (line.split(" ")(0), line))
val newStream = pairs7.join(pairs8)

newStream.foreachRDD(rdd => println(rdd.collect.map(_.toString).mkString(",")))

ssc.start

我看到的唯一问题是语法错误:line.split(" ")[0] vs line.split(" ")(0)但我想编译器会注意到这一点。