2

現在、RDBMS から移行するための POC に取り組んでおり、MongoDB を評価しています。スキーマを作成する過程で、それが私たちのニーズを満たしていることを確認したいと考えています。

いくつかの背景 - 1 日あたり +-100,000 ファイルを処理します - 約 10 の異なるファイル タイプ (さまざまなコレクションに入る) - 1 日あたり +1 億レコード - ファイルはパイプ区切りテキストです - Python を使用してデータを読み込みます - 各ファイル100 ~ 250 のフィールドを含む

現在の設定 - 各ファイル タイプは独自のテーブル (日ごとに分割) にロードされます。つまり、ファイル タイプ A はファイル A (パーティション 20120701) にあり、ファイル タイプ B はファイル B (パーティション 20120701) にあります。

  • 5 ~ 10 分ごとにデータを要約するジョブを実行します (1 時間ごとの傾向分析用)。
  • 毎日データを要約するジョブを実行します (毎日の傾向分析用)
  • データに対して結合などは行われません

ソース データのトリミングされたファイル (フィールドとレコードが削除されたもの) と、データを構造化するための 4 つの異なるオプションを含めました。私の現在のデザインは次のようになります。

  1. ファイル種別ごとの1日あたりの収集量(詳細記録) 例:FileA_20120701 FileB_20120701

  2. 1 時間ごとの要約データの月ごとの収集には、すべてのファイル タイプのレコードが含まれます。例: Hourly_usage_201207

  3. 日次集計データの年ごとの収集には、すべてのファイル タイプ レコード、つまり Daily_usage_2012 が含まれます

So : Map Reduce for Hourly > Map Reduce for Daily

現在、詳細な記録を保存する方法に焦点を当てています。ファイルで提供される生データを見てください。

SERIAL  TIMESTAMP   CUSTOMER_ID RESERVED01  PRODUCT_ID  CUSTOMER_TYPE   CUSTOMER_STATE  ChargeAmount_OF_UNITS   ChargeAmount_OF_FUND    ChargeAmount_FROM_ACCOUNT1  ACCOUNT1_BALANCE    ChargeAmount_FROM_ACCOUNT2  ACCOUNT2_BALANCE    WalletType1 UnitType1   ChargeAmount1   WalletBalance1  WalletType2 UnitType2   ChargeAmount2   WalletBalance2  WalletType3 UnitType3   ChargeAmount3   WalletBalance3  Bonus1  Bonus2  Bonus3  AddtionaInfo 
379120186   20120701235122  1345567 0   555 0   1000000 0   0   5   664 0   0   200 1   5   664 0   0   0   0   0   0   0   0               1234
379120190   20120701235124  1345568 0   1   0   1000000 0   0   4   108 0   0   200 1   4   108 0   0   0   0   0   0   0   0               
379120197   20120701235132  1345569 0   4   0   1000000 0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0               
379120203   20120701235136  1345570 0   1   0   1000000 0   0   0   346 0   0   0   0   0   0   0   0   0   0   0   0   0   0               XXX
379120207   20120701235138  1345571 0   10  0   1000000 0   0   0   0   3   100 200 1   3   100 500 2   10  0   610 2   20  80  10          
379120208   20120701235138  1345571 0   1   0   1000000 0   0   3   306 0   0   200 1   3   306 0   0   0   0   0   0   0   0               
379120211   20120701235141  1345573 0   1   0   1000000 0   0   0   181 0   0   0   0   0   0   0   0   0   0   0   0   0   0               
379120213   20120701235143  3101015742206   0   349 1   1000001 0   0   0   274 0   0   0   0   0   0   0   0   0   0   0   0   0   0               
379120214   20120701235144  3101015742206   0   349 1   1000001 0   0   0   0   120 680 210 1   37  0   200 18  120 680 0   0   0   0               
379120215   20120701235147  3101015742206   0   349 1   1000001 0   0   0   992 0   0   0   0   0   0   0   0   0   0   0   0   0   0               
379120217   20120701235147  3101015742206   0   349 1   1000001 0   2   0   1   0   0   400 3   2   1766    0   0   0   0   0   0   0   0               
379120223   20120701235149  3101015742206   0   349 1   1000001 0   0   11  196 0   0   200 1   11  196 0   0   0   0   0   0   0   0               
379120229   20120701235153  1345579 0   349 3   1000000 0   0   40  707 0   0   200 1   40  707 0   0   0   0   0   0   0   0   20  5       XXX
379120230   20120701235153  3101015742206   0   349 1   1000001 0   0   9   1702    0   0   200 1   9   1702    0   0   0   0   0   0   0   0               
379120232   20120701235153  1345581 0   349 2   1000000 0   0   150 59  0   0   200 1   150 59  0   0   0   0   0   0   0   0               
379120237   20120701235158  1345582 0   1   2   1000000 0   0   3   303 0   0   200 1   3   303 0   0   0   0   0   0   0   0               
379120241   20120701235202  538552582   0   14  0   1000000 0   0   0   779 10  777 210 1   150 200 0   0   0   0   0   0   0   0               YYY
379120245   20120701235206  538552582   0   14  0   1000000 0   0   3   300 0   0   200 1   3   300 0   0   0   0   0   0   0   0               
379120248   20120701235206  538552582   0   14  0   1000000 0   0   155 202 0   0   200 1   155 202 0   0   0   0   0   0   0   0               
379120250   20120701235208  538552582   0   14  0   1000000 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0               

data1.json 構造 :変換せずに CSV からデータをロードし、null を削除するだけです。これは理想的ではありませんが、処理時間が最も短くなります。

[
    {
        'SERIAL': 379120186,
        'TIMESTAMP': 20120701235122,
        'CUSTOMER_ID': 1345567,
        'RESERVED01': 0,
        'PRODUCT_ID': 555,
        'CUSTOMER_TYPE': 0,
        'CUSTOMER_STATE': 1000000,
        'ChargeAmount_OF_UNITS': 0,
        'ChargeAmount_OF_FUND': 0,
        'ChargeAmount_FROM_ACCOUNT1': 5,
        'ACCOUNT1_BALANCE': 664,
        'ChargeAmount_FROM_ACCOUNT2': 0,
        'ACCOUNT2_BALANCE': 0,
        'WalletType1': 200,
        'UnitType1': 1,
        'ChargeAmount1': 5,
        'WalletBalance1': 664,
        'WalletType2': 0,
        'UnitType2': 0,
        'ChargeAmount2': 0,
        'WalletBalance2': 0,
        'WalletType3': 0,
        'UnitType3': 0,
        'ChargeAmount3': 0,
        'WalletBalance3': 0,
        'Bonus1': '',
        'Bonus2': '',
        'Bonus3': '',
        'AddtionaInfo': '1234'
    },
    {
        'SERIAL': 379120203,
        'TIMESTAMP': 20120701235136,
        'CUSTOMER_ID': 1345570,
        'RESERVED01': 0,
        'PRODUCT_ID': 1,
        'CUSTOMER_TYPE': 0,
        'CUSTOMER_STATE': 1000000,
        'ChargeAmount_OF_UNITS': 0,
        'ChargeAmount_OF_FUND': 0,
        'ChargeAmount_FROM_ACCOUNT1': 0,
        'ACCOUNT1_BALANCE': 346,
        'ChargeAmount_FROM_ACCOUNT2': 0,
        'ACCOUNT2_BALANCE': 0,
        'WalletType1': 0,
        'UnitType1': 0,
        'ChargeAmount1': 0,
        'WalletBalance1': 0,
        'WalletType2': 0,
        'UnitType2': 0,
        'ChargeAmount2': 0,
        'WalletBalance2': 0,
        'WalletType3': 0,
        'UnitType3': 0,
        'ChargeAmount3': 0,
        'WalletBalance3': 0,
        'Bonus1': '',
        'Bonus2': '',
        'Bonus3': '',
        'AddtionaInfo': XXX
    },
    {
        'SERIAL': 379120207,
        'TIMESTAMP': 20120701235138,
        'CUSTOMER_ID': 1345571,
        'RESERVED01': 0,
        'PRODUCT_ID': 10,
        'CUSTOMER_TYPE': 0,
        'CUSTOMER_STATE': 1000000,
        'ChargeAmount_OF_UNITS': 0,
        'ChargeAmount_OF_FUND': 0,
        'ChargeAmount_FROM_ACCOUNT1': 0,
        'ACCOUNT1_BALANCE': 0,
        'ChargeAmount_FROM_ACCOUNT2': 3,
        'ACCOUNT2_BALANCE': 100,
        'WalletType1': 200,
        'UnitType1': 1,
        'ChargeAmount1': 3,
        'WalletBalance1': 100,
        'WalletType2': 500,
        'UnitType2': 2,
        'ChargeAmount2': 10,
        'WalletBalance2': 0,
        'WalletType3': 610,
        'UnitType3': 2,
        'ChargeAmount3': 20,
        'WalletBalance3': 80,
        'Bonus1': 10,
        'Bonus2': '',
        'Bonus3': '',
        'AddtionaInfo': ''
    }
]

data2.json 構造: 空の値を削除します。課金が発生しなかった (Wallet ID = 0) 課金フィールド (WalletType1-3) の値は削除されます。影響を受けたウォレットのみが保持されます。

    [
        {
            'SERIAL': 379120186,
            'TIMESTAMP': 20120701235122,
            'CUSTOMER_ID': 1345567,
            'PRODUCT_ID': 555,
            'CUSTOMER_TYPE': 0,
            'CUSTOMER_STATE': 1000000,
            'ChargeAmount_OF_UNITS': 0,
            'ChargeAmount_OF_FUND': 0,
            'ChargeAmount_FROM_ACCOUNT1': 5,
            'ACCOUNT1_BALANCE': 664,
            'ChargeAmount_FROM_ACCOUNT2': 0,
            'ACCOUNT2_BALANCE': 0,
            'WalletType1': 200,
            'UnitType1': 1,
            'ChargeAmount1': 5,
            'WalletBalance1': 664,
            'AddtionaInfo': 1234
        },
        {
            'SERIAL': 379120203,
            'TIMESTAMP': 20120701235136,
            'CUSTOMER_ID': 1345570,
            'RESERVED01': 0,
            'PRODUCT_ID': 1,
            'CUSTOMER_TYPE': 0,
            'CUSTOMER_STATE': 1000000,
            'ChargeAmount_OF_UNITS': 0,
            'ChargeAmount_OF_FUND': 0,
            'ChargeAmount_FROM_ACCOUNT1': 0,
            'ACCOUNT1_BALANCE': 346,
            'ChargeAmount_FROM_ACCOUNT2': 0,
            'ACCOUNT2_BALANCE': 0,
            'AddtionaInfo': 'XXX'
        },
        {
            'SERIAL': 379120207,
            'TIMESTAMP': 20120701235138,
            'CUSTOMER_ID': 1345571,
            'RESERVED01': 0,
            'PRODUCT_ID': 10,
            'CUSTOMER_TYPE': 0,
            'CUSTOMER_STATE': 1000000,
            'ChargeAmount_OF_UNITS': 0,
            'ChargeAmount_OF_FUND': 0,
            'ChargeAmount_FROM_ACCOUNT1': 0,
            'ACCOUNT1_BALANCE': 0,
            'ChargeAmount_FROM_ACCOUNT2': 3,
            'ACCOUNT2_BALANCE': 100,
            'WalletType1': 200,
            'UnitType1': 1,
            'ChargeAmount1': 3,
            'WalletBalance1': 100,
            'WalletType2': 500,
            'UnitType2': 2,
            'ChargeAmount2': 10,
            'WalletBalance2': 0,
            'WalletType3': 610,
            'UnitType3': 2,
            'ChargeAmount3': 20,
            'WalletBalance3': 80,
            'Bonus1': 10,
        }
    ]

data3.json 構造:空の文字列を削除します。充電からの値は、リストとともにキー「Charging」に挿入されます。ウォレット タイプがキーとして使用され、そのウォレット タイプのリンクされた情報はさらに下のレベルになります。ウォレットのみが影響を受け、挿入されています。

[
    {
        'SERIAL': 379120186,
        'TIMESTAMP': 20120701235122,
        'CUSTOMER_ID': 1345567,
        'PRODUCT_ID': 555,
        'CUSTOMER_TYPE': 0,
        'CUSTOMER_STATE': 1000000,
        'ChargeAmount_OF_UNITS': 0,
        'ChargeAmount_OF_FUND': 0,
        'ChargeAmount_FROM_ACCOUNT1': 5,
        'ACCOUNT1_BALANCE': 664,
        'ChargeAmount_FROM_ACCOUNT2': 0,
        'ACCOUNT2_BALANCE': 0,
        'CHARGING': 
            [
                {
                    '200': 
                        {
                            'UnitType': 1,
                            'ChargeAmount': 5,
                            'WalletBalance': 664
                        }
                }
            ] , 

        'AddtionaInfo': '1234'
    },
    {
        'SERIAL': 379120203,
        'TIMESTAMP': 20120701235136,
        'CUSTOMER_ID': 1345570,
        'RESERVED01': 0,
        'PRODUCT_ID': 1,
        'CUSTOMER_TYPE': 0,
        'CUSTOMER_STATE': 1000000,
        'ChargeAmount_OF_UNITS': 0,
        'ChargeAmount_OF_FUND': 0,
        'ChargeAmount_FROM_ACCOUNT1': 0,
        'ACCOUNT1_BALANCE': 346,
        'ChargeAmount_FROM_ACCOUNT2': 0,
        'ACCOUNT2_BALANCE': 0,
        'CHARGING' : [],
        'AddtionaInfo': 'XXX'
    },
    {
        'SERIAL': 379120207,
        'TIMESTAMP': 20120701235138,
        'CUSTOMER_ID': 1345571,
        'RESERVED01': 0,
        'PRODUCT_ID': 10,
        'CUSTOMER_TYPE': 0,
        'CUSTOMER_STATE': 1000000,
        'ChargeAmount_OF_UNITS': 0,
        'ChargeAmount_OF_FUND': 0,
        'ChargeAmount_FROM_ACCOUNT1': 0,
        'ACCOUNT1_BALANCE': 0,
        'ChargeAmount_FROM_ACCOUNT2': 3,
        'ACCOUNT2_BALANCE': 100,
        'CHARGING': 
            [
                {
                    '200': 
                        {               
                            'UnitType': 1,
                            'ChargeAmount': 3,
                            'WalletBalance': 100,
                        }
                },
                {
                    '500':
                        {
                            'UnitType': 2,
                            'ChargeAmount': 10,
                            'WalletBalance': 0,
                        }
                },
                {
                    '610':
                        {
                            'UnitType': 2,
                            'ChargeAmount': 20,
                            'WalletBalance': 80
                        }
                }
            ],
        'Bonus1': 10,
    }
]

data4.jsonは空の文字列を削除し、Charging 値は「Charging」に入れられますが、このレベルを維持し、「WalletType」キーを使用して、影響を受けたウォレットのみを再び保持します。リストには、請求された順序が表示されます。

[
    {
        'SERIAL': 379120186,
        'TIMESTAMP': 20120701235122,
        'CUSTOMER_ID': 1345567,
        'PRODUCT_ID': 555,
        'CUSTOMER_TYPE': 0,
        'CUSTOMER_STATE': 1000000,
        'ChargeAmount_OF_UNITS': 0,
        'ChargeAmount_OF_FUND': 0,
        'ChargeAmount_FROM_ACCOUNT1': 5,
        'ACCOUNT1_BALANCE': 664,
        'ChargeAmount_FROM_ACCOUNT2': 0,
        'ACCOUNT2_BALANCE': 0,
        'CHARGING': 
            [
                {
                    'WalletType': '200',
                    'UnitType': 1,
                    'ChargeAmount': 5,
                    'WalletBalance': 664
                }
            ] , 

        'AddtionaInfo': '1234'
    },
    {
        'SERIAL': 379120203,
        'TIMESTAMP': 20120701235136,
        'CUSTOMER_ID': 1345570,
        'RESERVED01': 0,
        'PRODUCT_ID': 1,
        'CUSTOMER_TYPE': 0,
        'CUSTOMER_STATE': 1000000,
        'ChargeAmount_OF_UNITS': 0,
        'ChargeAmount_OF_FUND': 0,
        'ChargeAmount_FROM_ACCOUNT1': 0,
        'ACCOUNT1_BALANCE': 346,
        'ChargeAmount_FROM_ACCOUNT2': 0,
        'ACCOUNT2_BALANCE': 0,
        'CHARGING' : [],
        'AddtionaInfo': 'XXX'
    },
    {
        'SERIAL': 379120207,
        'TIMESTAMP': 20120701235138,
        'CUSTOMER_ID': 1345571,
        'RESERVED01': 0,
        'PRODUCT_ID': 10,
        'CUSTOMER_TYPE': 0,
        'CUSTOMER_STATE': 1000000,
        'ChargeAmount_OF_UNITS': 0,
        'ChargeAmount_OF_FUND': 0,
        'ChargeAmount_FROM_ACCOUNT1': 0,
        'ACCOUNT1_BALANCE': 0,
        'ChargeAmount_FROM_ACCOUNT2': 3,
        'ACCOUNT2_BALANCE': 100,
        'CHARGING': 
            [
                {
                    'WalletType': '200',    
                    'UnitType': 1,
                    'ChargeAmount': 3,
                    'WalletBalance': 100,
                },
                {
                    'WalletType': 500,
                    'UnitType': 2,
                    'ChargeAmount': 10,
                    'WalletBalance': 0,
                },
                {
                    'WalletType': 610,
                    'UnitType': 2,
                    'ChargeAmount': 20,
                    'WalletBalance': 80
                }
            ],
        'Bonus1': 10,
    }
]

注: - データを要約すると、次のようなものが表示されます。

Date | Hour | Wallet  200 Total Charge| Wallet 500 Total Charge | Wallet 610 Total Charge 
  • これをトリミングしましたが、実際のファイルには WalletType1-20 があります

  • フィールド名 WalletType(1) の数字は、(ウォレット ID によって示される) ウォレットが請求された順序を示します。つまり、WalletType1 = 200 は、最初のウォレット 200 が請求されたことを意味します。

  • 請求された順序は、詳細な記録を表示する場合 (または概要の場合) に関連しています。

  • WalletType id は、ウォレット フィールドのどこにでも表示できます。つまり、Wallet ID = 200 は WalletType1 または WalletTyp2 などに入力できます。これは優先度ルールに依存します。

質問:

  • どのドキュメント構造をお勧めしますか?またその理由は?

  • 提供された構造の落とし穴は何ですか?

  • さらに提案/他の可能な構造はありますか?

  • シャーディング/パーティショニングに関する推奨事項はありますか?

4

2 に答える 2

2

最終的なスキーマは、私にとって最もコンパクトでクエリ可能に見えます。

長いキー名は避けてください。キー名は各ドキュメントに保存され、そのストレージ サイズが合計される可能性があります。SERIAL フィールドが一意の場合、SERIAL を個別に格納する代わりに、_id をその値に設定できます。

于 2012-07-05T17:25:50.973 に答える
1

1 日あたり +-100,000 個のファイルを処理するには、おそらくシャーディングは必要ありません。

于 2012-07-05T21:18:06.730 に答える