在map()

时间:2016-07-30 20:59:45

标签: java scala apache-spark key-value rdd

我正在尝试在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].....}

1 个答案:

答案 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);
                                   }