我将从一个例子开始。假设输入数据是
User1,product1,time1
User1,product2,time2
User1,product3,time3
User2,product2,time2
User2,product4,time6
现在,预期的输出是我必须将数据插入数据库(在我的情况下是aerospike(键值存储))中,在该数据库中,数据的格式应为
User1, [ [product1,time1],[product2,time2],[product3,time3] ]
User2, [ [product2,time2],[product4,time6] ]
所以在mapper中我输出了下面的
UserID, [productid,timestamp]
请不要假定[x,y]表示我正在输出列表,我可以从mapper以任何方式发送数据,也可以将数据写入自定义对象
所以在接收端我有格式的数据
User1, [ [product1,time1],[product2,time2],[product3,time3] ]
User2, [ [product2,time2],[product4,time6] ]
现在我可以做两件事
a) 我可以编写逻辑,只在reducer中将这些数据推送到数据库中(我不想这样做)
b) 我想做的是,当我们执行context.write()时,我想把数据写入数据库。
请帮助如何做到这一点,如果可能的话附加一个代码段或伪代码
ps:context.write()做什么?它写在哪里?它经历了哪些步骤和阶段?
1条答案
按热度按时间xt0899hw1#
据我所知,调用context.write需要一定数量的步骤
在驱动程序中,我们必须指定输出格式。现在让我们看看如果我们想写入一个文件会发生什么
对于写入文本文件,我们指定如下内容
现在,如果我们看到textoutputformat类的实现,它扩展了fileoutputformat(抽象类),fileoutputformat实现了outputformat接口,outputformat接口提供了两种方法
现在,outputformatclass只会告诉您要写什么样的记录,以及记录编写器是如何给出的,对于记录编写器来说,它只是
Object Key, Object Value
其中的值可以是单个的,也可以是一个列表,在记录编写器的实现中,我们指定了实际的逻辑,比如应该如何编写这个记录。现在回到最初的问题,在我的例子中,记录应该如何写入数据库
我创建了一个自定义输出格式
现在我们必须定义一个定制的记录编写器,它将获得一个键和一个值,并将数据写入数据库
以上代码只是一个片段,必须采取适当的设计策略。
附言:aerospike已经提供了一个录音机,可以扩展到这个链接,以满足您的需要