为RDD的每个元素使用sparkcontext函数

时间:2016-07-10 18:47:08

标签: apache-spark pyspark rdd

我需要使用Pyspark从Elasticsearch读取数据。我试图在pyspark中设置流程如下 -

i)创建rdd1
ii)foreach occurrence -ddd1 conf = {基于rdd1元素的动态值}
rdd2 = sc.newAPIHadoopRDD(" org.elasticsearch.hadoop.mr.EsInputFormat",\         " org.apache.hadoop.io.NullWritable"," org.elasticsearch.hadoop.mr.LinkedMapWritable",conf = conf)

我意识到" foreach"将在工作人员之间分配工作并尝试调用sc.newAPIHadoopRDD,从而导致工人无法获得sc的错误。

是否有其他方法可以实现上述目标? 注意 - 我需要使用" newAPIHadoopRDD"因为其余的处理依赖于它。

2 个答案:

答案 0 :(得分:0)

您无法嵌套RDD。如果您想循环遍历rdd1的结果,则必须首先collect给驱动程序。

val rdd1Result = rdd1.collect()
rdd1Result.foreach { v =>
  val conf = ...
  sc.newAPIHadoopRDD...
}

答案 1 :(得分:0)

你不能在foreach中发送RDD,你不应该尝试这样做。 除非你正在进行连接:在这种情况下,spark可以处理两个rdds,如果你考虑它,这就是你需要的一切。

看起来你正在做一个theta-join。 根据您的数据,您可以使用具有近似值的精确连接来绕过循环。