2015-04-06 64 views
0

阅读键值对我有JavaPairRDD采用以下格式:保存并在星火

JavaPairRDD< String, Tuple2< String, List< String>>> myData; 

我想将它保存为一个键值格式(String, Tuple2< String, List< String>>)

myData.saveAsXXXFile("output-path"); 

所以我的下一份工作可能会在数据读取方面直接向我JavaPairRDD

JavaPairRDD< String, Tuple2< String, List< String>>> newData = context.XXXFile("output-path"); 

我使用的Java 7,星火1.2,Java的API。我试过saveAsTextFilesaveAsObjectFile,都不起作用。而我在eclipse中看不到saveAsSequenceFile选项。

有没有人对这个问题有任何建议? 非常感谢!通过延长

org.apache.hadoop.io.Writable 

喜欢的东西

myData.saveAsHadoopFile(fileName, Text.class, CustomWritable.class, 
         SequenceFileOutputFormat.class); 

实施CustomWritable

回答

3

你可以使用SequenceFileRDDFunctions是通过在斯卡拉implicits使用,但是可能会比使用通常的建议对java的厉害这应该工作(没有检查编译):

public class MyWritable extends Writable{ 
    private String _1; 
    private String[] _2; 

    public MyWritable(Tuple2<String, String[]> data){ 
    _1 = data._1; 
    _2 = data._2; 
    } 

    public Tuple2<String, String[]> get(){ 
    return new Tuple2(_1, _2); 
    } 

    @Override 
    public void readFields(DataInput in) throws IOException { 
    _1 = WritableUtils.readString(in); 
    ArrayWritable _2Writable = new ArrayWritable(); 
    _2Writable.readFields(in); 
    _2 = _2Writable.toStrings(); 
    } 

    @Override 
    public void write(DataOutput out) throws IOException { 
    Text.writeString(out, _1); 
    ArrayWritable _2Writable = new ArrayWritable(_2); 
    _2Writable.write(out); 
    } 
} 

,以便它适合您的数据模型。

+0

在这种情况下,我的CustomWritable是Tuple2 >。我不认为我可以使Tuple2 >可写?我可以吗? – Edamame 2015-04-06 20:55:07

+0

你可以在scala中使用implicits使它看起来像是天生可能的。但是,鉴于Java,最好只创建一个MyTuple2Writable并映射到它。 – 2015-04-07 02:18:31

+0

谢谢贾斯汀。你能指出我可以使Tuple2 >可写的任何文档或示例吗?谢谢! – Edamame 2015-04-07 17:31:57