我使用Hadoop级联来处理HDFS上的数据,如下所示:
Tap inTap_file = new Hfs(new TextDelimited(true, "|~|"), data_hadoop_inPath + "order_summary/*.txt");
Tap outTap_file = new Hfs(new TextDelimited(true, "|~|"), data_hadoop_workingPath + "order_summary");
Pipe copyFilePipe = new Pipe("copy");
Pipe filePipe = null;
try {
filePipe = PipeFactory.getPipe("order_summary_Pipe", order_summary_fields);
} catch (Exception e) {
LOGGER.error("Failed to get order summary pipe!", e);
}
FlowDef flowDef_fileType = FlowDef.flowDef().addSource(copyFilePipe, inTap_file)
.addTailSink(filePipe, outTap_file);
flowDef_fileType.setName("OrderSumDailyFlow");
问题在于:收件箱下有多个文件。我使用* .txt来匹配所有文件。在处理完第一个文件后," data_hadoop_workingPath + order_summary"目的地已创建。处理第二个文件时,出现错误" data_hadoop_workingPath + order_summary已经存在。"我注意到了级联中的SinkMode,但SinkMode.UPDATE对Hadoop不起作用。如何为每个文件使用不同的接收路径?这里最好的做法是什么? 谢谢!
答案 0 :(得分:0)
一种选择是不将输出文件放在outTap_file
中。它将生成部分文件。
Tap outTap_file = new Hfs(new TextDelimited(true, "|~|"),
data_hadoop_workingPath + "order_summary");
仅提及您要写入的路径。如下所述
Tap outTap_file = new Hfs(new TextDelimited(true, "|~|"),
data_hadoop_workingPath);