0

我正在使用 JDBC 处理一些数据,其中我使用 gemfireXD 作为 DB,这是一个 InMemory 数据网格和一个 NewSQL 解决方案。

Step1 - 我从表(Table1)中获取所有不同的键(field1)

             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"));
             }

Step2 - 我正在为上面列表中的每个键查询同一个表。这应该为每个键返回 2 条记录。

我需要为每个键处理这 2 条记录,并从这 2 行中为该键创建一个最终处理的记录,最终需要将其存储在一个单独的表 (table2) 中。

    for (int i = 0; i< fieldList.size(); i++) {
        stmt.execute("select * from Table1 where field1=" + keyList.get(i));
        ResultSet rs = stmt.getResultSet();

        // the resultset should contain 2(or more) rows for the key which need to be processed based on some logic.
        // Finally need to create 1 processed record for the given key.
        // Insert the processed record to Table2
    }

由于我在Table1中有数百万条记录,上述处理数据的方式非常耗时。

我需要并行化 gemfireXD 中的处理。

我可以使用 PIG 或 SPARK 的并行处理功能(创建元组/记录袋和使用 MR 编程)在几个小时内在 PIG 或 SPARK 中进行相同的处理。

我希望 gemfireXD 必须有一些工具来并行处理数据,虽然我已经在 gemfireXD 中尝试过 DATAAWARE 过程并用它来并行化过程调用,但它对我不起作用。

我希望 gemfire XD 必须为此目的采用其他方法

有人可以建议 gemfireXD 中的任何实现方法来达到预期的结果吗?

4

3 回答 3

0

我错过了您使用的是 NoSQL 数据库。不过,我的回答可能适用。

我需要并行化 gemfireXD 中的处理。

你(很可能)没有。您肯定需要有效地访问数据库:

  • 使用准备好的语句(*)
  • 使用一些 SQL 能力

例如,使用语句

select * from Table1 order by field1

读取两行(或更一般地,读取直到field1更改)并处理它们。为自己节省数百万次查询!


虽然ORDER BY对于 NoSQL 数据库可能效率低下,但您肯定可以比数百万次查询做得更好,因为它们意味着数百万次往返等待和等待。例如,您可以发出 1000 个范围查询,每个查询将 1000 行加载到内存中。


(*) 恕我直言,所有与性能相关的问题where field1=" + keyList.get(i)都应立即关闭。连接 SQL 是完全错误的。

于 2015-06-17T21:21:20.957 回答
0

如果我正确理解您的要求,您可能正在寻找仅处理可能位于该节点本地的键的方法,以便您可以按照您所说的那样在分区表中使用 DAP(数据感知过程)分配处理。

分区将负责对您的数据进行分片,然后您可以使用 DAP 查询本地数据(该特定节点的本地数据)对其进行处理并将其插入回您的 table2。这里的另一个考虑因素是托管,因为您实际上可能需要一些托管才能使两个表以某种方式根据某些业务逻辑进行并置。

请看一下 DAP 合并排序示例。

如果您仍然遇到 DAP 问题,请分享您可能遇到的详细信息或例外情况。

希望有帮助。

参考:

于 2015-06-20T05:38:34.117 回答
0

为什么不使用 join 而不是一一处理呢?

当 2 个表位于同一位置时,GemfireXD 可以使用连接。

我建议您创建另一个表来存储您的第一个查询并使用与您的表相同的分区键对其进行分区,然后加入它们以获得您的结果。让我们将您的原始表称为 table1,将临时表称为 tmp。您可以使用以下查询获得结果。它应该比您的迭代方法快得多

select s.* from table1 s join tmp t on s.field1=t.field1
于 2016-03-22T19:56:58.827 回答