我正在使用JDBC来处理一些数据,我将gemfireXD用作数据库,这是一个InMemory数据网格和一个NewSQL解决方案。
Step1 - 我从表(Table1)
获取所有不同的键(field1)Parallel.ForEach
Step2 - 我从上面的列表中查询每个键的同一个表。这应该为每个键返回2条记录。
我需要为每个密钥处理这两个记录,并从密钥的这两行中创建一个最终处理过的记录,最后需要存储在一个单独的表中(table2)。
Statement stmt = conn.createStatement();
stmt.execute("select distinct field1 from Table1");
ResultSet rs = stmt.getResultSet();
List<String> keyList = new ArrayList<String> ();
while (rs.next()) {
keyList.add(rs.getString("field1"));
}
由于表1中有数百万条记录,上述处理数据的方式非常耗时。
我需要在gemfireXD中并行化处理。
我可以使用他们的并行处理功能(创建元组/包记录和使用MR编程)在几小时内在PIG或SPARK中执行相同的处理。
我希望gemfireXD必须有一些工具来进行数据的并行处理,虽然我在gemfireXD中尝试了DATAAWARE程序并用它来并行化程序调用,但它对我不起作用。
我希望gemfire XD必须有其他方法用于此目的
有没有人可以建议gemfireXD中的任何实现方法来实现所需的结果?
答案 0 :(得分:0)
我错过了你正在使用NoSQL数据库。不过,我的答案可能适用。
我需要在gemfireXD中并行化处理。
你(很可能)没有。您肯定需要有效地访问数据库:
例如,使用语句
select * from Table1 order by field1
读取两行(或者更常见的是,读取直到field1
更改)并处理它们。节省数以百万计的查询!
虽然ORDER BY
对于NoSQL数据库来说可能效率低下,但你肯定会比数以百万计的查询更好,因为它们意味着数百万次往返等待和等待。例如,您可以发出1000个范围查询,每个查询将1000行加载到内存中。
(*)恕我直言,所有与where field1=" + keyList.get(i)
类似的表现相关的问题应立即关闭。连接SQL是完全错误的。
答案 1 :(得分:0)
如果我正确理解您的要求,您可能正在研究如何仅处理可能是该节点本地的密钥,以便您可以使用分区表中的DAP(数据感知过程)分发处理。
分区将处理分片数据,然后您可以使用DAP查询本地数据(特定节点的本地数据)并将其插回到table2中来处理它。这里的另一个考虑因素是托管,因为您可能实际上需要一些托管,以便根据某些业务逻辑使两个表以某种方式并置。
请查看DAP合并排序示例。
如果您仍然遇到DAP问题,请分享您可能获得的详细信息或例外情况。
希望有所帮助。
参考文献:
答案 2 :(得分:0)
为什么不使用join而不是逐个处理它们?
GemfireXD可以在共存2个表时使用连接。
我建议您创建另一个表来存储您的第一个查询,并使用与您的表相同的分区键对其进行分区,然后将它们连接起来以获得结果。让我们将原始表作为table1调用,将临时表作为tmp调用。您可以使用以下查询获取结果。它应该比你的迭代方法快得多
select s.* from table1 s join tmp t on s.field1=t.field1