我们拥有的平面文件(CSV)的行数超过200,000,000,我们将其导入具有23个维表的星型模式中。最大的维度表有300万行。目前,我们在单台计算机上运行导入过程,大约需要15个小时。由于时间太长,我们想利用40台计算机来进行导入。
我的问题
如何有效利用40台计算机进行导入。主要的担心是,在所有节点上复制维表将花费大量时间,因为它们在所有节点上都必须相同。这可能意味着,如果将来我们使用1000台服务器进行导入,由于服务器之间的广泛网络通信和协调,它实际上可能比使用单个服务器慢。
有人有建议吗?
编辑:
以下是CSV文件的简化:
"avalue";"anothervalue"
"bvalue";"evenanothervalue"
"avalue";"evenanothervalue"
"avalue";"evenanothervalue"
"bvalue";"evenanothervalue"
"avalue";"anothervalue"
导入后,表如下所示:
Dimensions_table1
id name
1 "avalue"
2 "bvalue"
Dimensions_table2
id name
1 "anothervalue"
2 "evenanothervalue"
事实表
dimension_table1_ID dimension_table2_ID
1 1
2 2
1 2
1 2
2 2
1 1
最佳答案
将CSV数据加载到数据库中很慢,因为它需要读取,拆分和验证数据。
因此,您应该尝试的是:
确保您的加载器工具可以将数据导入到已经包含数据的表中。如果无法执行此操作,请检查数据库文档中的“远程表”。许多数据库都允许在本地显示来自另一个DB服务器的表。
这使您可以运行
insert into TABLE (....) select .... from REMOTE_SERVER.TABLE
之类的命令如果您需要主键(并且应该),则在导入到本地DB的过程中分配PK时也会遇到问题。我建议将PK添加到CSV文件。
[编辑] 在检查完您的修改后,您应该尝试以下操作:
cut -d";" -f1 | sort -u | nawk ' { print FNR";"$0 }'
这是一个非常便宜的过程(即使是巨大的文件也要花费几分钟)。它为您提供ID值文件。
如果ID值文件太大,则只需对小文件执行此步骤,然后将大文件加载到所有40个每计算机DB中。
如果您有大量的ID值文件,则可以使用在每台计算机上创建的表替换所有剩余的值。
或者,甚至更好的是,将数据保留在40台计算机上,并使用并行计算中的算法来拆分工作并合并结果。这就是Google可以在几毫秒内从数十亿个网页创建搜索结果的方式。
参见here for an introduction。