Spark - 将RDD保存为多个文件作为输出

时间:2015-07-14 07:06:35

标签: java apache-spark

我有一个JavaRDD<Model>,我需要把它写成多个不同布局的文件[RDD中的一个或两个字段在不同的布局之间会有所不同]。

当我使用saveAsTextFile()调用模型的toString()方法时,意味着相同的布局将被写为输出。

目前我正在做的是使用map转换方法迭代RDD并使用其他布局返回不同的模型,因此我可以使用saveAsTextFile()动作来编写不同的输出文件。

由于一个或两个字段不同,我需要再次迭代整个RDD并创建新的RDD,然后将其保存为输出文件。

例如:

当前RDD包含字段:

RoleIndicator,姓名,年龄,地址,部门

输出文件1:

姓名,年龄,地址

输出文件2:

RoleIndicator,姓名,年龄,部门

对此有什么最佳解决方案吗?

此致 香卡

2 个答案:

答案 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;
  }
}