如何让Map程序处理hdfs中的整个文件

bbmckpt7  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(419)

在这段代码中,我读取了包含hl7消息的文件,并使用hapi iterator(从http://hl7api.sourceforge.net)

File file = new File("/home/training/Documents/msgs.txt");
InputStream is = new FileInputStream(file);
is = new BufferedInputStream(is);

Hl7InputStreamMessageStringIterator iter = new   
     Hl7InputStreamMessageStringIterator(is);

我想在map函数中实现这一点?显然,我需要防止inputformat中的拆分,将整个文件作为单个值读取一次,然后将其更改为string(文件大小为7kb),因为您知道hapi只能解析整个消息。
我对这一切都是新手,所以请容忍我。

uxh89sit

uxh89sit1#

如果不希望分割数据文件,或者希望使用一个Map器来处理整个文件。这样一个文件将只由一个Map器处理。在这种情况下,扩展map/reduce inputformat并重写issplitable()方法并以布尔形式返回“false”将对您有所帮助。
参考:(不基于您的代码)https://gist.github.com/sritchie/808035

aydmsdu9

aydmsdu92#

由于输入来自文本文件,因此可以重写fileinputformat的issplitable()方法。使用此方法,一个Map器将处理整个文件。 public boolean isSplitable(Context context,Path args[0]) { return false; }

ozxc1zmp

ozxc1zmp3#

您需要实现自己的fileinputformat子类:
它必须覆盖 isSplittable() 方法 false 这意味着Map器的数量将等于输入文件的数量:每个Map器一个输入文件。
你还需要实施 getRecordReader() 方法。这正是您需要将解析逻辑从上面放到下面的类。

相关问题