如何存储和读取Spark PairRDD中的数据

时间:2015-05-28 07:38:31

标签: apache-spark

Spark PairRDD可以选择保存文件。

JavaRDD<String> baseRDD = context.parallelize(Arrays.asList("This", "is", "dummy", "data"));

JavaPairRDD<String, Integer> myPairRDD =
    baseRDD.mapToPair(new PairFunction<String, String, Integer>() {

      @Override
      public Tuple2<String, Integer> call(String input) throws Exception {
        // TODO Auto-generated method stub
        return new Tuple2<String, Integer>(input, input.length());
      }
    });

myPairRDD.saveAsTextFile("path");

Spark上下文textfile仅将数据读取到JavaRDD。

如何直接从源重建PairRDD?

注意:

  • 可能的方法是将数据读取到JavaRDD<String>并构建JavaPairRDD

但是,由于数据庞大,它需要大量的资源。

  • 以非文本格式存储此中间文件也没问题。

  • 执行环境 - JRE 1.7

3 个答案:

答案 0 :(得分:4)

如果你不介意结果文件不是人类可读的,你可以将它们保存为目标文件。

保存文件:

myPairRDD.saveAsObjectFile(path);

然后你可以阅读这样的对:

JavaPairRDD.fromJavaRDD(sc.objectFile(path))

修改

工作示例:

JavaRDD<String> rdd = sc.parallelize(Lists.newArrayList("1", "2"));
rdd.mapToPair(p -> new Tuple2<>(p, p)).saveAsObjectFile("c://example");
JavaPairRDD<String, String> pairRDD 
    = JavaPairRDD.fromJavaRDD(sc.objectFile("c://example"));
pairRDD.collect().forEach(System.out::println);

答案 1 :(得分:3)

在这种情况下,将Spark PairRDD存储在Sequence文件中效果很好。

JavaRDD<String> baseRDD = context.parallelize(Arrays.asList("This", "is", "dummy", "data"));

JavaPairRDD<Text, IntWritable> myPairRDD = baseRDD.mapToPair(new PairFunction<String, Text, IntWritable>() {

  @Override
  public Tuple2<Text, IntWritable> call(String input) throws Exception {
    // TODO Auto-generated method stub
    return new Tuple2<Text, IntWritable>(new Text(input), new IntWritable(input.length()));
  }
});

myPairRDD.saveAsHadoopFile(path , Text.class, IntWritable.class,
    SequenceFileOutputFormat.class);

JavaPairRDD<Text, IntWritable> newbaseRDD =
    context.sequenceFile(path , Text.class, IntWritable.class);

// Verify the data
System.out.println(myPairRDD.collect());
newbaseRDD.foreach(new VoidFunction<Tuple2<Text, IntWritable>>() {
  @Override
  public void call(Tuple2<Text, IntWritable> arg0) throws Exception {
    System.out.println(arg0);
  }
});

正如user52045所建议的,以下代码适用于Java 8。

myPairRDD.saveAsObjectFile(path);
JavaPairRDD<String, String> objpairRDD = JavaPairRDD.fromJavaRDD(context.objectFile(path));
objpairRDD.collect().forEach(System.out::println);

答案 2 :(得分:1)

使用Scala的示例:

阅读文本文件&amp;将其另存为对象文件格式

val ordersRDD = sc.textFile("/home/cloudera/orders.txt");
ordersRDD.count();
ordersRDD.saveAsObjectFile("orders_save_obj");

阅读目标文件&amp;将其保存为文本文件格式:

val ordersRDD = sc.objectFile[String]("/home/cloudera/orders.txt");
ordersRDD.count();
ordersRDD.saveAsTextFile("orders_save_text");