Scala 如何将每个RDD的元组转换为另一个元组以对协议数据进行分组?

Scala 如何将每个RDD的元组转换为另一个元组以对协议数据进行分组?,scala,apache-spark,Scala,Apache Spark,我有一个元组: val key = List(protocol, source, destination, port) 对于每个rdd 我需要把这个映射到 (protocol ,List(source, destination, port)) 然后应将其简化为 List(source,(destination1, destination2)) 按协议分组 最后,它应该像一个具有 (protocol, (source, (destination1, destination2))) 我需要的

我有一个元组:

val key = List(protocol, source, destination, port)
对于每个rdd

我需要把这个映射到

(protocol ,List(source, destination, port))
然后应将其简化为

List(source,(destination1, destination2))
协议分组

最后,它应该像一个具有

(protocol, (source, (destination1, destination2)))
我需要的输出如下:

{(tcp , (xx.xx.xx.xx ,(ww.ww.w.w,rr.rr.r.r))) , (udp,(yy.yy.yy.yy,(ww.ww.w.w,rr.rr.r.r)))}
代码是:

val lines = KafkaUtils.createStream[String, PcapPacket, StringDecoder,PcapDecoder](ssc, kafkaParams, Map(topics -> 1), StorageLevel.MEMORY_ONLY)
val m = lines.window(Seconds(4), Seconds(4)).mapPartitions(x =>
          x.map{y => analysis(y._2)}
        )
这将给出(5个字段作为输出)

您可以先按(协议、源)分组,然后按(协议)分组。例如:


但是,您需要确保协议的数据可以适合内存。

valm=lines.window(秒(4),秒(4)).mapPartitions(x=>x.map{y=>analysis(y.\u2)}这将给出(“tcp”,“xx.xx.xx.xx”,“ww.ww.w”,12345)作为输出。但我无法使用此输出数据流执行上述操作。无法解析符号groupByKey,collect。。你能帮帮我吗?你忘了导入org.apache.spark.SparkContext.\uu?m的类型是什么?是否导入org.apache.spark.streaming.StreamingContext.m的类型为DStream[(String,String,String,Int,Int)]。是,导入的Streamingcontext。5个字段?然后你需要相应地更新
map
函数,它应该是关闭的,但既然它得到了答案,我就把它留在这里。
import org.apache.spark.SparkContext._

val testData = List(
  ("tcp", "xx.xx.xx.xx", "ww.ww.w.w", 12345),
  ("tcp", "xx.xx.xx.xx", "rr.rr.r.r", 12345),
  ("udp", "yy.yy.yy.yy", "ww.ww.w.w", 12345),
  ("udp", "yy.yy.yy.yy", "rr.rr.r.r", 12345)
)
val rdd = sc.parallelize(testData)
val resultRDD = rdd.map {
  case (protocol, source, destination, port) => ((protocol, source), destination)
}.groupByKey().map {
  case ((protocol, source), destinations) => (protocol, (source, destinations.toSeq))
}.groupByKey()
resultRDD.collect().foreach(println)