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

Storing multiple Strings in the Value field of a Map

在我的一个银行项目中,我有一个 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,凯文,彼得森,.. 1003,5003,苏安,林,.... 1004,5004,迈克尔,冲,... 1005,5005,菲利普,安德森,....

最终输出的格式应为

SourceAccountNumber、SrcCustomerNumber、SourceCustomerFirstNmae、SourceCustomerLastName、DestinationAccountNumber、DestinationCustomerNbr、DestCustomerFirstNmae、DessCustomerLastName、转账金额

例如:

1001,5001,约翰,纳什,1005,5005,菲利普,安德森,.....

1003,5003,Sue-Ann,Lim,1002,5002,Kevin,Peterson,....

我的问题是我是否必须使用记录文件在扩充中添加 FirstName 和 LastName 的字段 我应该如何打破地图方面的记录文件

1) 两个不同的映射 Map1(以 CustomeNbr 为键,以名字为值)和 Map2(以 customerNbr 为键,以 lastName 为值) 2) 一个单独的地图 mapSingle(以 CustomerNbr 作为键,但用户定义的对象 class 作为值,其中名字和姓氏都作为字段)

它们中哪一个在性能方面会更快,考虑到 RecordFile 有超过 1000 万条记录,而 transactionData 每 15 分钟的容量几乎为 10 GB window 并且此作业每 15 分钟运行一次分钟以丰富数据。

第二个版本更高效,你只在映射中查找一次键,而在第一个版本中你查找两次因此计算键的哈希码的两倍并在哈希桶中查找。

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

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