如何根据文件名定义不同路径的hadoop级联tap?

um6iljoc  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(375)

我使用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\uhadoop\uworkingpath+order\u summary”目的地。在处理第二个文件时,出现了一个错误:data\uhadoop\uworkingpath+order\u summary已经存在。我注意到级联中有sinkmode,但sinkmode.update对hadoop不起作用。如何为每个文件使用不同的接收器路径?这里的最佳做法是什么?谢谢您!

ewm0tg9j

ewm0tg9j1#

一种选择是不将输出文件放入 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);

相关问题