我正在尝试在map()中使用filter()但是我得到了这个火花异常:
RDD转换和操作只能由驱动程序调用,而不能在其他转换内部调用;例如,rdd1.map(x => rdd2.values.count()* x)无效,因为无法在rdd1.map转换内执行值转换和计数操作。有关更多信息,请参阅SPARK-5063。
我知道spark不允许嵌套转换/动作/ RDD,所以任何人都可以给我一个建议如何交替进行(没有嵌套转换或动作),我有一个RDD它的元组就像:
JavaRDD< String[]> RDD
我尝试映射它,给它一个列表作为参数,这个列表包含javaPairRDDs:
List<JavaPairRDD<String,String>> list
JavaRDD< String[]> result = RDD.map(new modifyRDD(list));
这些行指的是modifyRDD()函数:
public static class modifyRDD implements Function <String[], String[]> {
List<JavaPairRDD<String,String>> list;
public modifyRDD (List<JavaPairRDD<String,String>> list ){ this.list=list;}
public String [] call(String[] t) {
String[] s = t;
for (int i = 0; i < NB_TD; i++) {
int j=i;
// select the appropriate RDD from the RDDs_list to the current index
JavaPairRDD<String,String> rdd_i = list.get(i);
String previousElement=s[j];
JavaPairRDD<String,String> currentRDD = rdd_i.filter(line -> line._1().equals(previousElement));
String newElement=currentRDD.first()._2();
s[j]=newElement;
}
return (s) ;
}
}
所以,问题在于这一行
JavaPairRDD<String,String> currentRDD = rdd_i.filter(line -> line._1().equals(previousElement));
现在我举一个例子,假设该列表包含2个PairRDD
list={PairRDD1={(a,b)(c,d)},PairRDD2={(u,v)(x,y)}..}
我要映射的RDD包含:
JavaRDD< String[]> RDD = {[a,u],[c,x],[a,x].....}
我想要的结果是在map()之后:
JavaRDD< String[]> result = {[b,v],[d,y],[b,y].....}
答案 0 :(得分:0)
我从List&gt;中更改了列表的类型到列表&gt;&gt;列表,以避免处理map()内的RDD,现在我没有例外(offcourse bcz我没有嵌套的转换),但我不确定它是否如果我的新代码是有效的,bcz列表&gt;很大,并且为了搜索元素我使用循环“for”(意味着我必须扫描整个List&gt;以获得我想要的元素)所以我请你作为专家给我评论它(使用循环为),并提出改善它的建议。谢谢
这是修改后的map()函数
public static class modifyRDD implements Function <String[], String[]> {
List<List<Tuple2<String,String>>> list;
public modifyRDD (List<List<Tuple2<String,String>>> list ){ this.list=list;}
public String [] call(String[] t) {
String[] s = t;
for (int i = 0; i < NB_TD; i++) {
// select the appropriate lookup_list
List<Tuple2<String,String>> list_i = list.get(i);
String previousElement=s[i];
String newElement="";
for (int k = 0; k < list_i.size(); k++){
Tuple2<String,String> sk1 = list_i.get(k);
if (sk1._1.equals( previousElement)){ newElement=sk1._2;}
}
s[i]= newElement;
}
return(s);
}