迭代一对RDD以从第二个值在RDD上运行函数。

时间:2016-03-22 03:59:09

标签: scala apache-spark spark-streaming rdd

我遇到一个需要RDD作为输入的函数(我无法修改)的问题,但是我的数据是这样的格式,我似乎无法将RDD放入函数中。

考虑由groupby创建的RDD,它由(“name”,data)对组成,称为coolRdd。数据是Iterable [String],名称是String。但是,我需要在它上运行CoolFunction,它接受类型(Rdd [String],String)。这是我的尝试:

coolRdd.foreach{ case (name, data) => sc.CoolFunction(data.toList, name) }

返回

found   : List[String]
required: org.apache.spark.rdd.RDD[String]

我也尝试在data.toList上运行sc.parallelize,但这会产生一个nullPointer,因为它会创建一个Spark不允许的RDD RDD。

我想知道是否可以编写另一个可以对数据进行转换的函数,然后调用必要的CoolFunction。如果我不必在驱动程序上执行此操作会更好,但如果有必要,那是可行的。

作为奖励:我实际上是通过流媒体进行此操作,所以整个混乱将会调用foreachRDD,但我希望如果我能够在正常情况下工作,我可以让它工作在流媒体案例中。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案:

coolRdd.
collect.
foreach{ case (name, data) => 
 val data_list = data.toList
 sc.coolFunction(sc.parallelize(data_list), pid)
}

我错的地方没有收集。因为只有驾驶员知道RDD,所以这里需要收集。