[英]combine the table data in multiple csv files into one single csv file in ruby
[英]Hadoop Combine Multiple part files into single file
目前我有
part-00001 part-00002
我知道使用hdfs -getmerge
是将这些文件合并为一个文件的最佳方法。 但是,是否可以通过编程方式进行 ?
我尝试使用MultipleOutput ,但是它不起作用。 我还尝试编写自己的CustomOutputFormat
但是由于在并行将其并行写入文件时使用了多个reducer,因此在关闭Dataoutputstream时会出现org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException
错误。
您始终可以从Java代码中使用FileSystem类 ,可能只需要调用concat方法即可。
MultipleOutput几乎相反。 除了生成part-xxxxx
文件之外,它还会生成自定义名称的文件,这通常意味着比以前更多的文件。
CustomOuputFormat也不是一个好主意,因为在任何情况下,您的输出文件都将与减速器数量一样多。 输出格式不会改变它。
使用单个reducer( setNumReduceTasks(1)
)可能是一个setNumReduceTasks(1)
解决方案,但是不必要地昂贵,因为它“杀死”了并行性(所有数据都由单个任务处理)。 仅在您的数据很小时才考虑使用它,否则请避免使用它。
另一种解决方案是在MapReduce作业完成后,从Java代码中简单地将hdfs -getmerge
作为shell命令调用。
您无法通过Hadoop对其进行编程编程,并且这些文件的创建取决于所配置的reducer数量。 为什么需要以编程方式合并这些文件? 如果要作为另一项工作输入,则始终可以将目录提及为输入,如果有很多小CombineInputFormat
文件,则可以使用CombineInputFormat
。 否则,如果要合并自己的hdfs -getmerge
是最佳选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.