对于我们的ETL,事实数据没有item_key,但有item_number。在加载过程中,如果我们可以找到item_number的item_key,那么只需使用它,如果找不到,则自动创建item_key。目前这个过程并不是平行的,我正在考虑使用scala并行运行它,因为scala具有内置的并发集合。
使用一个简单的例子:
val keys=1 to 1000
val items=keys map {num=>"Item"+num}
var itemMap=(items zip keys).toMap
现在我们要加载数百万行,其项目编号为:
def g(v:String)=List.fill(5000)(v)
var fact="Item2000" :: List(items.flatMap(x=>g(x)))
由于事实数据有一个项目item2000,它无法在itemMap的项目主数据中找到,我们需要自动创建(item2000,2000)的地图并将其添加到itemMap中,以便将来我们再次找到item2000我们可以使用相同的项目密钥。
如何使用并发集合实现?对于事实数据中行的每个循环,如果找不到项密钥然后自动创建,那么我们需要一种方法来锁定itemMap,否则可能有多个thead尝试将自动创建数据插入到itemMap中