現在、RDBMS から移行するための POC に取り組んでおり、MongoDB を評価しています。スキーマを作成する過程で、それが私たちのニーズを満たしていることを確認したいと考えています。
いくつかの背景 - 1 日あたり +-100,000 ファイルを処理します - 約 10 の異なるファイル タイプ (さまざまなコレクションに入る) - 1 日あたり +1 億レコード - ファイルはパイプ区切りテキストです - Python を使用してデータを読み込みます - 各ファイル100 ~ 250 のフィールドを含む
現在の設定 - 各ファイル タイプは独自のテーブル (日ごとに分割) にロードされます。つまり、ファイル タイプ A はファイル A (パーティション 20120701) にあり、ファイル タイプ B はファイル B (パーティション 20120701) にあります。
- 5 ~ 10 分ごとにデータを要約するジョブを実行します (1 時間ごとの傾向分析用)。
- 毎日データを要約するジョブを実行します (毎日の傾向分析用)
- データに対して結合などは行われません
ソース データのトリミングされたファイル (フィールドとレコードが削除されたもの) と、データを構造化するための 4 つの異なるオプションを含めました。私の現在のデザインは次のようになります。
ファイル種別ごとの1日あたりの収集量(詳細記録) 例:FileA_20120701 FileB_20120701
1 時間ごとの要約データの月ごとの収集には、すべてのファイル タイプのレコードが含まれます。例: Hourly_usage_201207
日次集計データの年ごとの収集には、すべてのファイル タイプ レコード、つまり 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 などに入力できます。これは優先度ルールに依存します。
質問:
どのドキュメント構造をお勧めしますか?またその理由は?
提供された構造の落とし穴は何ですか?
さらに提案/他の可能な構造はありますか?
シャーディング/パーティショニングに関する推奨事項はありますか?