Java 在映射()中使用筛选器()时引发异常

Java 在映射()中使用筛选器()时引发异常,java,scala,apache-spark,key-value,rdd,Java,Scala,Apache Spark,Key Value,Rdd,我试图在map()中使用filter(),但我遇到了以下spark异常: RDD转换和操作只能由驱动程序调用,不能在其他转换内部调用;例如,rdd1.map(x=>rdd2.values.count()*x)无效,因为无法在rdd1.map转换内部执行值转换和计数操作。有关更多信息,请参阅SPARK-5063 我知道spark不允许嵌套转换/操作/RDD,所以任何人都可以给我一个建议,或者如何做(没有嵌套转换或操作),我有一个RDD,它的元组如下: JavaRDD< String[]&g

我试图在map()中使用filter(),但我遇到了以下spark异常:

RDD转换和操作只能由驱动程序调用,不能在其他转换内部调用;例如,rdd1.map(x=>rdd2.values.count()*x)无效,因为无法在rdd1.map转换内部执行值转换和计数操作。有关更多信息,请参阅SPARK-5063

我知道spark不允许嵌套转换/操作/RDD,所以任何人都可以给我一个建议,或者如何做(没有嵌套转换或操作),我有一个RDD,它的元组如下:

 JavaRDD< String[]> RDD
我要映射的RDD包含:

 JavaRDD< String[]> RDD = {[a,u],[c,x],[a,x].....}
JavaRDDRDD={[a,u],[c,x],[a,x]…}
我想要的结果是在map()之后:

JavaRDDresult={[b,v],[d,y],[b,y]…}

为了避免在map()中处理RDD,我将列表的类型从list>更改为list>>list(),现在我没有例外(当然bcz我没有嵌套转换),但我不确定的是,我的新代码是否有效,bcz list>是否很大,以及在搜索元素时是否使用了循环“for”(意味着我必须扫描整个列表>,以获得我想要的元素)因此,我请您作为专家对其进行评论(使用循环),并提出改进建议。谢谢

这是修改后的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);
                                   }
公共静态类modifyRDD实现函数{
名单;
公共修改RDD(列表){this.List=List;}
公共字符串[]调用(字符串[]t){
字符串[]s=t;
对于(int i=0;i
您读过错误消息和相应的JIRA吗?Spark不支持嵌套的操作和转换,就像它不支持嵌套的RDD一样。是的,但我可以做些什么作为替代解决方案这个问题已经讨论了这么多时间了…简短回答:a)RDD很小收集并使用局部变量或广播b)RDD很大表示这个问题,因为joinit很大在我的情况下,你能给我一些我可以遵循的步骤吗,please@zero323如果您注意到我在map函数中使用了pairdds列表,bcz和我需要的每个索引pairdd都不同,那么如何将我的RDD与所有这些pairdds(如果你看到示例,我有2个pairdds,在我的情况下,我不知道列表中有多少pairdds)
  JavaPairRDD<String,String> currentRDD =  rdd_i.filter(line -> line._1().equals(previousElement));
list={PairRDD1={(a,b)(c,d)},PairRDD2={(u,v)(x,y)}..}
 JavaRDD< String[]> RDD = {[a,u],[c,x],[a,x].....}
 JavaRDD< String[]> result = {[b,v],[d,y],[b,y].....}
  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);
                                   }