在我的一个银行项目中,我有一个RecordFile文件,其中包含一些格式为:
的记录CustomerNumber,AccountNumber,FirstName,LastName,其他一些字段......
在一些完全存在于不同文件中的交易记录中,CustomerNumber或AccountNumber或(很少)都会填充。
mapreduce工作的目的是使用RecordFile
来丰富事务数据这项工作有两个输入 1)包含交易记录的文件的目录 记录是格式的 SourceAccountNumber,SrcCustomerNumber,DestinationAccountNumber,DestinationCustomerNbr,AmountTransferred(其他一些字段)
问题是在某些情况下,可能无法填充所有字段,并且必须使用RecordFile来丰富这些字段 样本记录是:
1001,1005,5005,75,...
在此记录中,如果您看到sourceCustomerNbr,即客户启动交易未填充
,5003,1002,,49,...
在此记录中,缺少srcAccountNumber和DestinationCustomerNbr
2)RecordFile这个gil包含客户详细信息,如客户编号,帐号,名字,姓氏,SSN等等。
格式是
CustomerNumber,AccountNumber,FirstName,LastName,其他一些字段...... 例如
1001,5001,约翰,纳什,.... 1002,5002,凯文,Petersom,.. 1003,5003,苏安,廉.... 1004,5004,迈克尔,冲,... 1005,5005,菲利普,安德森,....
最终输出的格式应为
SourceAccountNumber,SrcCustomerNumber,SourceCustomerFirstNmae,SourceCustomerLastName,DestinationAccountNumber,DestinationCustomerNbr,DestCustomerFirstNmae,DessCustomerLastName,AmountTransferred
例如:
1001,5001,约翰,纳什,1005,5005,菲利普,安德森,.....
1003,5003,苏安,林,1002,5002,凯文,彼得森,....
我的问题是我是否必须使用recordfile在浓缩中添加FirstName和LastName的字段 我应该如何根据地图
打破记录文件1)两个不同的地图Map1(将CustomeNbr作为键,名字作为值)和Map2(将customerNbr作为键,将lastName作为值) 2)单个Map mapSingle(将CustomerNbr作为键,但将用户定义的类的对象作为Value,将firstname和lastname都作为字段)
其中哪一个在性能方面会更快,考虑到RecordFile有1000万条记录这一事实,而且每15分钟窗口的事务数量几乎是10 gb,这项工作每15分钟运行一次以丰富数据。
答案 0 :(得分:1)
第二个版本效率更高,您只需在地图中查找一次键,而在第一个版本中查找两次,因此计算两次键的哈希码并查看哈希桶。
它也是一种更灵活的方法,将来如果您想要添加更多字段,客户可以这样做。否则,您还必须为该字段创建新地图。
您还可以使用JMH检查代码段的效果。 JMH是一个Java工具,用于构建,运行和分析用Java和其他语言编写的针对JVM的nano / micro / milli / macro基准测试。