我遇到一个需要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,但我希望如果我能够在正常情况下工作,我可以让它工作在流媒体案例中。
答案 0 :(得分:0)
我找到了解决方案:
coolRdd.
collect.
foreach{ case (name, data) =>
val data_list = data.toList
sc.coolFunction(sc.parallelize(data_list), pid)
}
我错的地方没有收集。因为只有驾驶员知道RDD,所以这里需要收集。