我需要使用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"因为其余的处理依赖于它。
答案 0 :(得分:0)
您无法嵌套RDD。如果您想循环遍历rdd1
的结果,则必须首先collect
给驱动程序。
val rdd1Result = rdd1.collect()
rdd1Result.foreach { v =>
val conf = ...
sc.newAPIHadoopRDD...
}
答案 1 :(得分:0)
你不能在foreach中发送RDD,你不应该尝试这样做。 除非你正在进行连接:在这种情况下,spark可以处理两个rdds,如果你考虑它,这就是你需要的一切。
看起来你正在做一个theta-join。 根据您的数据,您可以使用具有近似值的精确连接来绕过循环。