我有一个JavaRDD<Model>
,我需要把它写成多个不同布局的文件[RDD中的一个或两个字段在不同的布局之间会有所不同]。
当我使用saveAsTextFile()
调用模型的toString()
方法时,意味着相同的布局将被写为输出。
目前我正在做的是使用map
转换方法迭代RDD并使用其他布局返回不同的模型,因此我可以使用saveAsTextFile()动作来编写不同的输出文件。
由于一个或两个字段不同,我需要再次迭代整个RDD并创建新的RDD,然后将其保存为输出文件。
例如:
当前RDD包含字段:
RoleIndicator,姓名,年龄,地址,部门
输出文件1:
姓名,年龄,地址
输出文件2:
RoleIndicator,姓名,年龄,部门
对此有什么最佳解决方案吗?
此致 香卡
答案 0 :(得分:3)
您想使用foreach
,而不是collect
。
您应该将您的函数定义为扩展VoidFunction
的实际命名类。为两个文件创建实例变量,并添加一个关闭文件的close()
方法。您的call()
实施将编写您需要的任何内容。
完成后,请记得在功能对象上调用close()
。
答案 1 :(得分:0)
可以使用Pair RDD。 通过使用Hadoop自定义输出格式,可以在一次迭代中将Pair RDD存储在多个文件中。
rdd.saveAsHadoopFile(path, key.class, value.class,CustomTextOutputFormat.class, jobConf);
public class FileGroupingTextOutputFormat extends MultipleTextOutputFormat<Text, Text> {
@Override
protected Text generateActualKey(Text key, Text value) {
return new Text();
}
@Override
protected Text generateActualValue(Text key, Text value) {
return value;
}
// returns a dynamic file name based on each RDD element
@Override
protected String generateFileNameForKeyValue(Text key, Text value, String name) {
return value.getSomeField() + "-" + name;
}
}