在地图的值字段中存储多个字符串

时间:2015-05-27 10:01:54

标签: java dictionary mapreduce

在我的一个银行项目中,我有一个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分钟运行一次以丰富数据。

1 个答案:

答案 0 :(得分:1)

第二个版本效率更高,您只需在地图中查找一次键,而在第一个版本中查找两次,因此计算两次键的哈希码并查看哈希桶。

它也是一种更灵活的方法,将来如果您想要添加更多字段,客户可以这样做。否则,您还必须为该字段创建新地图。

您还可以使用JMH检查代码段的效果。 JMH是一个Java工具,用于构建,运行和分析用Java和其他语言编写的针对JVM的nano / micro / milli / macro基准测试。