【问题标题】:Spark - save RDD to multiple files as outputSpark - 将RDD保存到多个文件作为输出
【发布时间】:2015-07-14 07:06:35
【问题描述】:

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

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

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

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

例如:

具有字段的当前 RDD:

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

输出文件 1:

姓名、年龄、地址

输出文件 2:

RoleIndicator、姓名、年龄、部门

有没有最佳解决方案?

问候, 尚卡尔

【问题讨论】:

  • 你需要两种不同格式的 2 个文件中的相同数据吗?
  • @VijayInnamuri : 有点类似,文件 1 的 RDD 中的字段很少,而文件 2 的 RDD 中的字段也很少,而且两个文件中很少有字段可以相同。
  • @VijayInnamuri:是的,基本上我在寻找相同的数据需要写入 2 个不同格式的 2 个文件?有可能吗?

标签: java apache-spark


【解决方案1】:

您想使用foreach,而不是collect

您应该将您的函数定义为扩展VoidFunction 的实际命名类。为这两个文件创建实例变量,并添加一个关闭文件的close() 方法。您的 call() 实现将编写您需要的任何内容。

完成后记得在你的函数对象上调用close()

【讨论】:

  • 我已经在我的本地机器上尝试过了,它在独立模式下运行良好,几乎没有记录。但是,如果我想在 Hadoop YARN 集群上的 HDFS 上写相同的内容,而不是使用使用 FileWriter 类和数百万条记录的本地文件系统,该怎么办?另外,如果我在集群上使用本地文件系统,当我们使用多线程 [hadoop Cluster] 时它会覆盖任何记录吗?
  • 当你说扩展 VoidFunction 的类时,VoidFunction 是一个接口。你想让我创建接口还是类?
  • @Shankar:你需要实现一个接口才能使用它。我在通用术语中使用了“扩展”(如果您使用的是 Scala,那将是您使用的关键字)。
  • 发布此消息后我意识到foreach 将在集群中执行,因此您最终可能会在集群周围散布文件。您可能需要在主节点上迭代分区。
  • 最后,除非它确实解决了您的问题,否则请不要接受答案。
【解决方案2】:

可以使用 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;
  }
}

【讨论】:

  • 谢谢。我已经用我的期望更新了我的问题?是否可以使用 saveAsHadoopFile()?在您的代码中,我看不到您指定不同布局的任何地方。
  • 它没有回答问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 2014-09-22
相关资源
最近更新 更多