0

JDBC を使用して、InMemory データ グリッドと NewSQL ソリューションである DB として gemfireXD を使用しているデータを処理しています。

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

ステップ 2 - 上記のリストの各キーについて同じテーブルをクエリしています。これにより、キーごとに 2 つのレコードが返されます。

キーごとにこれら 2 つのレコードを処理し、キーのこれら 2 つの行から最終的に処理された 1 つのレコードを作成する必要があります。これは、最終的に別のテーブル (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 プログラミングの使用) を使用して、数時間以内にこれと同じ処理を行うことができます。

gemfireXD で DATAAWARE プロシージャを試し、それを使用してプロシージャ呼び出しを並列化しましたが、gemfireXD にデータの並列処理を行うための機能が必要であることを願っていますが、うまくいきませんでした。

私は、gemfire XD がこの目的のために他のアプローチを持たなければならないことを望んでいます

望ましい結果を達成するために、gemfireXD の実装アプローチを提案してください。

4

3 に答える 3

0

あなたの要件を正しく理解していれば、パーティション分割されたテーブルで DAP (Data Aware Procedures) を使用して、あなたが言ったように処理を分散できるように、そのノードにローカルである可能性のあるキーのみを処理する方法を検討している可能性があります。

パーティショニングによってデータのシャーディングが処理され、ローカル データ (その特定のノードに対してローカル) をクエリする DAP を使用してデータを処理し、テーブルに挿入し直すことができます2。ここでのもう 1 つの考慮事項はコロケーションです。これは、ビジネス ロジックに従って両方のテーブルを何らかの方法でコロケーションするために、実際にはコロケーションが必要になる場合があるためです。

DAP マージソートの例をご覧ください。

DAP でまだ問題がある場合は、発生している可能性のある詳細または例外を共有してください。

それが役立つことを願っています。

参考文献:

于 2015-06-20T05:38:34.117 に答える