我的项目是收集大量有关饮食习惯的数据,并使用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,那么欧洲防风草就不会与困倦相关联。有很多像这样的输入文件。
这是我对该项目的计划:
第一个MapReduce将读入文件并创建(键,值)对,其中键是“食物,感觉”,而值只是“一个”。换句话说,它将创建成对,其中关键是食物与感觉相关的任何时间。然后,减少将像字数一样,将所有输入中给定的“食物,感觉”的所有时间相加。
第二个MapReduce将把“食物感觉,总和”作为其(关键,值)对。然后它将每种感觉都映射到导致它的所有食物,从而产生“感觉,食物”,x次的(关键值)。然后它会减少输出感觉的因果关系的前五种食物,导致以下输出:
“感觉1:食物1,x事件”
“感觉1:食物2,x事件”
我的问题是我不知道如何设置第一个MapReduce函数。我已经阅读了很多关于MapReduce的文献,并熟悉了常见的MaxTemp和WordCount示例,但我的问题是我不知道如何使用12小时窗口并使用输入文件来创建“食物” - 感觉,1“键值对。任何建议都会有用。我知道它与map函数有关,它将整个文件文本作为一个值而不仅仅是一个单独的行。
由于
答案 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
之后,映射器将分隔线并处理它们。
第二种方法效率很低。