我有一个程序可以从文件中创建一个对象列表,并且还会创建一个相同类型对象的列表,但是数据库中的对象属性较少,而且有一些不同的属性,如: 从文件列表:地址ID,地址,城市,州,邮编,其他重要属性 DB中的列表:地址ID,地址,城市,州
我已经在这个CustObj上实现了IEquatable,因此它只与Address,City和State进行比较,希望能够在两个列表之间进行简单的比较。
最终目标是从数据库中获取地址ID,并更新文件中对象列表中每个地址的地址ID。这两个列表可能有很多对象(超过1,000,000),所以我希望它很快。
另一种方法是将其卸载到数据库并让DB返回我们需要的信息。如果这将显着更快/更节省资源,我将走这条路线,但我想看看它是否可以在代码中快速有效地完成。
无论如何,我看到有一种Zip方法。我想知道我是否可以使用它来说"如果两个列表之间存在匹配,请将数据保留在列表1中,但将列表1中每个对象的地址id属性更新为列表中的地址Id 2"
这可能吗?
答案 0 :(得分:0)
答案是,这取决于。你还没有提到很多参数。
唯一可以确定的方法是构建一个解决方案(最好使用zip方法,因为它涉及的工作量较少),如果它符合您的要求参数(时间或任何其他参数,内存占用?),你可以止步
否则您必须将其卸载到数据库。请注意,如果您想使用zip方法,则必须同时保存文件中的100万条记录和内存中的100万条记录。
将所有内容推送到数据库的问题是,插入许多记录是消耗的资源(时间,空间等)。此外,如果你想每天都这样做,那将更加困难,资源明智。
您的问题没有说明这是生产环境中的一次性事件还是日常事件。即使这样也会对选择哪种方法产生影响。
重复一遍,你必须尝试不同的方法,根据你的要求看看哪种方法最适合你:这是一次性的事吗?这个过程有多少资源?它有多少时间?可能还有更多。
答案 1 :(得分:0)
听起来有点像val df4 = df3.groupBy("pos_id", "article_id").agg(max("date"), sum("qte"), sum("ca")).join(hist2.select("pos_id", "article_id", "sale_price"), Seq("pos_id", "article_id"))
又名
.Aggregate()
通常我会使用一个空的otherListPrefilled,但不确定它是如何对100k数据项执行的。
如果它是一次性的东西,将文件放到csv可能会更快,将它作为临时表导入数据库并加入sql中的数据。