Spark:循环通过JavaRDD元组 - Java

时间:2016-02-01 19:45:39

标签: java apache-spark apache-spark-sql

我正在尝试使用元组循环遍历JavaRDD但是我在如何正确循环JavaRDD以及将rdd_value设置为等于rdd_array中包含的元组(无论b迭代器计数器值是什么)时遇到一些问题。

这是我的代码

Address 12

编辑: 伙计们,我真的在这里尝试,在JavaRDD上接受错误无法解决的方法,为foreachloop提出了零点建议。

(/[a-zA-Z+\s?\d+$]/.test(field)

2 个答案:

答案 0 :(得分:2)

请注意,在您自己尝试回答时,您实际上正在处理看似<K,V>的内容,其中K(密钥)为长,V(值)一个元组7。这与您在原始问题中提出的内容大不相同。最有可能的是,使用JavaPairRDD可以更有效地实现这一目标。

从RDD开始,您可以使用

将JavaRDD转换为JavaPairRDD
JavaPairRDD<Long,Tuple7<...>> prdd = rdd.mapToPair(...)

这将包括基于您的密钥的重新分区。

使用.foreach进行最终处理也会将rdd结果序列化到驱动程序并执行包含的逻辑序列。您可能需要考虑使用filter,reduce和其他范例来推动RDD上游的大部分逻辑。您还可以考虑使用.foreachPartition在任务节点上实现某种程度的并行性和计算,而不是在驱动程序上。

请注意,使用Java 8 lambda语法,您可以将大部分逻辑写得更紧凑:

prdd.foreach((k,v)->{
  System.out.println("Printing: " + k + ", " + v._1() ...);
});

现在,要注意另一件事......使用更专用的类而不是通用的Tuple7<>会更容易。至少它可能看起来像这样:

public class UserLocation {
  public long id;
  public String text;
  public String createdat;
  public String userlocation;
  public String name;
  public String username;
  public String lat;
  public String lon;
  @Override
  public String toString() {
    return Long.toString(id)+text+createdat+userlocation+name+username+lat+lon;
  }
}

然后,您的处理可能如下所示:

JavaRDD<UserLocation> jrdd;
JavaPairRDD<Long,UserLocation> jprdd = jrdd.mapToPair((v)->new Tupple2<>(v.id,v));
...

jprdd
  .foreach((k,v)->{
     System.out.println(v.toString());
  });

通常,在这个例子中,将数据映射到JavaPairRDD<Long,UserLocation>并不是真正的目的。但是,您的数据将根据Long键重新分区,并且可以具有更好的并行性。

答案 1 :(得分:0)

使用以下功能解决

 rdd_array.foreach(new VoidFunction<Tuple2<Long, Tuple7<String, String, String, String, String, String, String>>>() {
        @Override
        public void call(Tuple2<Long, Tuple7<String, String, String, String, String, String, String>> rdd_val) throws Exception {

            //new Tuple7<String, String, String, String, String, String, String>(text,created_at,userlocation,name,username,lat,lon);
            String id = rdd_val._1().toString();
            String text = rdd_val._2()._1().toString();
            String createdat = rdd_val._2()._2().toString();
            String userlocation = rdd_val._2()._3().toString();
            String name = rdd_val._2()._4().toString();
            String username = rdd_val._2()._5().toString();
            String lat = rdd_val._2()._6().toString();
            String lon = rdd_val._2()._7().toString();


            System.out.println("Printing Values EXTRA: "+id+text+createdat+userlocation+name+username+lat+lon);
        }
    });