我们有大于200,000,000行的平面文件(CSV),我们将其导入到一个包含23个维度表的星型模式中。最大的维度表有300万行。目前,我们在一台计算机上运行导入过程,大约需要15个小时。因为时间太长了,我们想用40台电脑来做进口。
我的问题
如何有效地利用40台计算机进行导入。主要担心的是,在所有节点上复制维度表将花费大量时间,因为它们需要在所有节点上保持相同。这可能意味着,如果将来我们使用1000台服务器进行导入,由于服务器之间广泛的网络通信和协调,它实际上可能比使用单个服务器慢。
有人有建议吗?
编辑:
以下是CSV文件的简化:
"avalue";"anothervalue"
"bvalue";"evenanothervalue"
"avalue";"evenanothervalue"
"avalue";"evenanothervalue"
"bvalue";"evenanothervalue"
"avalue";"anothervalue"导入后,表如下所示:
dimension_table1
id name
1 "avalue"
2 "bvalue"dimension_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发布于 2011-04-12 08:17:51
将CSV数据加载到数据库中很慢,因为它需要读取、拆分和验证数据。
所以你应该尝试的是:
确保加载器工具可以将数据导入已经包含数据的表中。如果无法做到这一点,请查看DB文档中的“远程表”。许多数据库允许在本地显示来自另一个DB服务器的表。
允许运行像insert into TABLE (....) select .... from REMOTE_SERVER.TABLE这样的命令。
如果您需要主键(而且您应该这样做),那么在导入到本地DB期间,您也会遇到分配PKs的问题。我建议将PKs添加到CSV文件中。
检查编辑后的编辑,下面是您应该尝试的内容:
见在这里作一个介绍。
发布于 2011-04-26 22:10:34
您可以考虑使用64位哈希函数为每个字符串生成一个bigint ID,而不是使用顺序ID。
使用64位哈希码,您可以在哈希表中存储2^(32 - 7)或超过3,000万项,然后才有0.0031%的可能发生冲突。
这将允许您在所有节点上具有相同的ID,在“调度”阶段和“合并”阶段之间没有任何服务器之间的通信。
您甚至可以增加位数以进一步降低碰撞的可能性;只是,您无法使结果哈希适合于64位整数数据库字段。
请参见:
哈希
http://code.google.com/p/smhasher/wiki/MurmurHash
http://www.partow.net/programming/hashfunctions/index.html
发布于 2011-04-12 08:05:57
这是一个非常普遍的问题,不考虑数据库后端。在数据库后端上使用40或1000台无法处理负载的机器触发将不会给您带来任何好处。这样的问题是,要想在特定的way..you中回答这个问题,首先应该与您的组织中拥有足够的DB级别技能的人员联系,然后再提出一个更具体的问题。
https://stackoverflow.com/questions/5632127
复制相似问题