मेरी राय में, सबसे अच्छा अभ्यास अपने स्वयं के निकालने का निर्माण कर रहा है। यह आपकी पसंद की भाषा के साथ किया जा सकता है और आप सीएसवी या जेएसओएन को निकाल सकते हैं।
लेकिन यदि आप तेजी से दिख रहे हैं और यदि आपका डेटा बड़ा नहीं है और एक सर्वर के भीतर फिट हो सकता है, तो मैं mongoexport
का उपयोग करने की सलाह देता हूं।
{
"_id" : "tdfMXH0En5of2rZXSQ2wpzVhZ",
"statuses" : [
{
"status" : "dc9e5511-466c-4146-888a-574918cc2534",
"score" : 53.24388894
}
],
"stored_at" : ISODate("2017-04-12T07:04:23.545Z")
}
तो फिर तुम जैसे अपना BigQuery स्कीमा (mongodb_schema.json
) परिभाषित करने की जरूरत: मान लेते हैं आप इस तरह के नीचे के रूप में एक सरल दस्तावेज़ संरचना करते हैं
$ cat > mongodb_schema.json <<EOF
[
{ "name":"_id", "type": "STRING" },
{ "name":"stored_at", "type": "record", "fields": [
{ "name":"date", "type": "STRING" }
]},
{ "name":"statuses", "type": "record", "mode": "repeated", "fields": [
{ "name":"status", "type": "STRING" },
{ "name":"score", "type": "FLOAT" }
]}
]
EOF
अब, मज़ा हिस्सा :-) निकाला जा रहा शुरू होता है आपके मोंगोडीबी से जेएसओएन के रूप में डेटा। आइए मान लें कि आपके पास प्रतिकृति सेट नाम statuses
के साथ क्लस्टर है, आपका डीबी sample
है, और आपका संग्रह status
है।
mongoexport \
--host statuses/db-01:27017,db-02:27017,db-03:27017 \
-vv \
--db "sample" \
--collection "status" \
--type "json" \
--limit 100000 \
--out ~/sample.json
आप ऊपर देख सकते हैं, मैं उत्पादन 100k रिकॉर्ड क्योंकि मैं सुझाव है कि आप अपने सभी डेटा के लिए यह करने से पहले BigQuery में नमूना और लोड चलाने की सीमा। उपरोक्त आदेश चलाने के बाद आपके पास sample.json
में अपना नमूना डेटा होना चाहिए लेकिन एक क्षेत्र $date
है जो आपको BigQuery पर लोड करने में त्रुटि उत्पन्न करेगा। ठीक करने के लिए है कि हम sed
का उपयोग उन्हें सरल फ़ील्ड नाम को बदलने के लिए कर सकते हैं: का उपयोग कर निम्न कमांड
# Fix Date field to make it compatible with BQ
sed -i 's/"\$date"/"date"/g' sample.json
अब आप सेक कर सकते हैं Google क्लाउड संग्रहण (GCS) पर अपलोड करें और फिर BigQuery में लोड:
# Compress for faster load
gzip sample.json
# Move to GCloud
gsutil mv ./sample.json.gz gs://your-bucket/sample/sample.json.gz
# Load to BQ
bq load \
--source_format=NEWLINE_DELIMITED_JSON \
--max_bad_records=999999 \
--ignore_unknown_values=true \
--encoding=UTF-8 \
--replace \
"YOUR_DATASET.mongodb_sample" \
"gs://your-bucket/sample/*.json.gz" \
"mongodb_schema.json"
यदि सब कुछ ठीक था, फिर वापस जाने के लिए और mongoexport
आदेश से --limit 100000
को हटा दें और फिर से चलाने के ऊपर फिर से आदेश 100k नमूना के बजाय सब कुछ लोड करने के लिए।
वैकल्पिक समाधान:
आपको अधिक आज़ादी और प्रदर्शन चाहते हैं, आपकी चिंता का विषय नहीं है, तो आप के रूप में अच्छी mongo
CLI उपकरण का उपयोग कर सकते हैं। इस तरह आप जावास्क्रिप्ट में अपना निकास तर्क लिख सकते हैं और इसे अपने डेटा के विरुद्ध निष्पादित कर सकते हैं और फिर BigQuery पर आउटपुट भेज सकते हैं।
# Export Logic in JavaScript
cat > export-csv.js <<EOF
var size = 100000;
var maxCount = 1;
for (x = 0; x < maxCount; x = x + 1) {
var recToSkip = x * size;
db.entities.find().skip(recToSkip).limit(size).forEach(function(record) {
var row = record._id + "," + record.stored_at.toISOString();;
record.statuses.forEach(function (l) {
print(row + "," + l.status + "," + l.score)
});
});
}
EOF
# Execute on Mongo CLI
_MONGO_HOSTS="db-01:27017,db-02:27017,db-03:27017/sample?replicaSet=statuses"
mongo --quiet \
"${_MONGO_HOSTS}" \
export-csv.js \
| split -l 500000 --filter='gzip > $FILE.csv.gz' - sample_
# Load all Splitted Files to Google Cloud Storage
gsutil -m mv ./sample_* gs://your-bucket/sample/
# Load files to BigQuery
bq load \
--source_format=CSV \
--max_bad_records=999999 \
--ignore_unknown_values=true \
--encoding=UTF-8 \
--replace \
"YOUR_DATASET.mongodb_sample" \
"gs://your-bucket/sample/sample_*.csv.gz" \
"ID,StoredDate:DATETIME,Status,Score:FLOAT"
सुझाव:: यहाँ है कि मैं क्या एक ही प्रक्रिया के लिए किया था, लेकिन सीएसवी में उत्पादन करने के लिए जावास्क्रिप्ट का इस्तेमाल किया तो मैं यह BigQuery में बहुत आसान लोड कर सकते हैं है ऊपर स्क्रिप्ट में मैंने किया था करने में सक्षम करने के लिए उत्पादन पाइप द्वारा छोटे चाल sample_
उपसर्ग के साथ कई फ़ाइलों में आउटपुट विभाजित करें। इसके अलावा विभाजन के दौरान यह आउटपुट जीज़िप करेगा ताकि आप जीसीएस को आसान बना सकें।
दिनांक फ़ील्ड के बारे में कैसे? जब मैं दिनांक/समय फ़ील्ड पर डेटा निर्यात करता हूं तो "$ date" जैसा दिखता है जो BigQuery फ़ील्ड नामों के लिए स्वीकार्य नहीं है। क्या इसके समाधान की कोई युक्ति है? – Qorbani
मुझे लगता है कि दुर्भाग्यवश, आपको किसी भी तरह उनका नाम बदलने की आवश्यकता होगी। –
धन्यवाद इलियट, मुझे इसे ठीक करने का एक तरीका मिल गया है और इसे इस प्रश्न का एक और जवाब भी सबमिट करें जो भविष्य में मेरे जैसे किसी की मदद कर सकता है :-) – Qorbani