在 Spark 中保存和读取键值对
Save and Read Key-Value pair in Spark
我有一个 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,Spark 1.2,Java API。我试过 saveAsTextFile
和 saveAsObjectFile
,都不起作用。而且我在 eclipse 中没有看到 saveAsSequenceFile
选项。
有人对这个问题有什么建议吗?
非常感谢!
您可以使用在 scala 中通过隐式使用的 SequenceFileRDDFunctions,但这可能比使用 java of:
的通常建议更糟糕
myData.saveAsHadoopFile(fileName, Text.class, CustomWritable.class,
SequenceFileOutputFormat.class);
通过扩展
实现CustomWritable
org.apache.hadoop.io.Writable
像这样的东西应该可以工作(没有检查编译):
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);
}
}
使其适合您的数据模型。
我有一个 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,Spark 1.2,Java API。我试过 saveAsTextFile
和 saveAsObjectFile
,都不起作用。而且我在 eclipse 中没有看到 saveAsSequenceFile
选项。
有人对这个问题有什么建议吗? 非常感谢!
您可以使用在 scala 中通过隐式使用的 SequenceFileRDDFunctions,但这可能比使用 java of:
的通常建议更糟糕myData.saveAsHadoopFile(fileName, Text.class, CustomWritable.class,
SequenceFileOutputFormat.class);
通过扩展
实现CustomWritable
org.apache.hadoop.io.Writable
像这样的东西应该可以工作(没有检查编译):
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);
}
}
使其适合您的数据模型。