在MapReduce中读取整个文件

时间:2017-05-10 19:08:42

标签: java hadoop mapreduce

我的项目是收集大量有关饮食习惯的数据,并使用MapReduce(我计划使用两种不同的MapReduces)来找出前五种食物与给定感觉的相关性。示例输入文件如下:

food parsnips  2017/1/24 7:00
food beef  2017/1/24 9:00
food oats  2017/1/24 12:00
feel sleepy  2017/1/24 16:00
food pineapple  2017/1/24 17:00
food squid  2017/1/25 7:00
feel sleepy  2017/1/25 11:00
food blueberries  2017/1/25 12:00
food plums  2017/1/25 14:00
feel headache  2017/1/25 18:00
food broccoli  2017/1/25 19:00
food strawberries  2017/1/26 6:00
feel tired  2017/1/26 6:00
food oats  2017/1/26 7:00
food celery  2017/1/26 8:00
food lobster  2017/1/26 9:00
food wings  2017/1/26 9:00
feel stomachache  2017/1/26 14:00
food fish  2017/1/26 16:00
food rice  2017/1/27 6:00
food barley  2017/1/27 11:00
food wings  2017/1/27 17:00
feel itchy  2017/1/27 18:00
food mustard  2017/1/27 19:00
food icecream  2017/1/28 6:00
feel sleepy  2017/1/28 6:00
food oats  2017/1/28 10:00
feel stomachache  2017/1/28 10:00
food grapes  2017/1/28 13:00
food cheese  2017/1/28 14:00
food bread  2017/1/28 15:00
feel itchy  2017/1/28 17:00

给定的食物与食物食用后12小时的感觉有关。例如:在第一行中,欧洲防风草会“昏昏欲睡”作为与之相关的感觉,因为睡眠感觉发生在吃欧洲防风草后9小时。如果'困'发生在18:00,那么欧洲防风草就不会与困倦相关联。有很多像这样的输入文件。

这是我对该项目的计划:

  1. 第一个MapReduce将读入文件并创建(键,值)对,其中键是“食物,感觉”,而值只是“一个”。换句话说,它将创建成对,其中关键是食物与感觉相关的任何时间。然后,减少将像字数一样,将所有输入中给定的“食物,感觉”的所有时间相加。

  2. 第二个MapReduce将把“食物感觉,总和”作为其(关键,值)对。然后它将每种感觉都映射到导致它的所有食物,从而产生“感觉,食物”,x次的(关键值)。然后它会减少输出感觉的因果关系的前五种食物,导致以下输出:

  3. “感觉1:食物1,x事件”

    “感觉1:食物2,x事件”

    我的问题是我不知道如何设置第一个MapReduce函数。我已经阅读了很多关于MapReduce的文献,并熟悉了常见的MaxTemp和WordCount示例,但我的问题是我不知道如何使用12小时窗口并使用输入文件来创建“食物” - 感觉,1“键值对。任何建议都会有用。我知道它与map函数有关,它将整个文件文本作为一个值而不仅仅是一个单独的行。

    由于

1 个答案:

答案 0 :(得分:0)

直接的方法是实现自己的InputFormat,你可以从here得到一个例子。

另一种方法是实现一个单独的MapReduce程序来预处理整个数据。例如将您想要的行数放在一行中,例如,假设您想通过映射器处理5行,然后执行此操作

food parsnips  2017/1/24 7:00
food beef  2017/1/24 9:00
food oats  2017/1/24 12:00
feel sleepy  2017/1/24 16:00
food pineapple  2017/1/24 17:00

与此类似:

food parsnips  2017/1/24 7:00 | food beef  2017/1/24 9:00 | food oats 2017/1/24 12:00 | feel sleepy  2017/1/24 16:00 | food pineapple  2017/1/24 17:00

之后,映射器将分隔线并处理它们。

第二种方法效率很低。