ওভারভিউ
আর্থ ইঞ্জিনের কম্পিউটেশনাল আর্কিটেকচারটি ইমেজ (পিক্সেল-ভিত্তিক) গণনাকে দ্রুত এবং মাপযোগ্য করার জন্য অপ্টিমাইজ করা হয়েছে। BigQuery একইভাবে ট্যাবুলার ডেটা (ভেক্টর) এর স্কেলযোগ্য প্রক্রিয়াকরণের জন্য অপ্টিমাইজ করা হয়েছে এবং এতে অনেক বৈশিষ্ট্য রয়েছে যা এটিকে আর্থ ইঞ্জিনের একটি চমৎকার পরিপূরক করে তোলে।
উদাহরণ কর্মপ্রবাহ অন্তর্ভুক্ত:
- আর্থ ইঞ্জিনে জেনারেট হওয়া ডেটাতে বড় BigQuery যোগদান করে
- BigQuery-এ আরও প্রক্রিয়াকরণের জন্য চিত্র থেকে প্রাপ্ত পরিসংখ্যান সহ ভেক্টর ডেটা টীকা করা
- আর্থ ইঞ্জিন থেকে পর্যায়ক্রমে একটি সংযোজনযোগ্য BigQuery টেবিলে ডেটা রপ্তানি করা হচ্ছে
আপনার যদি অন্যান্য দুর্দান্ত ব্যবহারের ক্ষেত্রে থাকে, আমরা সেগুলি সম্পর্কে শুনতে চাই!
BigQuery বেসিক
আর্থ ইঞ্জিন BigQuery টেবিলে লেখে, এবং সমস্ত টেবিল ডেটাসেটে থাকে। নির্দিষ্ট ডেটাসেট BigQuery-এ না থাকলে এক্সপোর্ট টাস্ক ব্যর্থ হয়। BigQuery ডেটাসেটের ভূমিকায় আরও জানুন।
ডেটাসেট তৈরি
ডেটাসেটের নাম, স্টোরেজ অঞ্চল এবং মেয়াদ শেষ হওয়ার আচরণ (অন্যান্য কিছু, আরও উন্নত বিকল্পের সাথে) সহ অনেকগুলি সৃষ্টি-সময়ের বিকল্প রয়েছে।
ডেটাসেট তৈরি করার জন্য বিভিন্ন পদ্ধতি রয়েছে, তবে শুরু করার একটি সহজ উপায় হল ক্লাউড কনসোলের মাধ্যমে:
- ক্লাউড কনসোলে BigQuery পৃষ্ঠাতে নেভিগেট করুন।
- অনুরোধ করা হলে API সক্রিয় করতে "সক্ষম করুন" এ ক্লিক করুন।
- "SQL ওয়ার্কস্পেস" ট্যাব থেকে, প্রকল্পের পাশে তিন-বিন্দু মেনুতে ক্লিক করুন ( )।
- "ডেটাসেট তৈরি করুন" বিকল্পটি নির্বাচন করুন।
- কনফিগারেশন গাইড অনুসরণ করুন.
একটি ডেটাসেট তৈরি এবং কনফিগার করার সমস্ত বিকল্পের জন্য, BigQuery ডকুমেন্টেশন দেখুন।
অনুমতি
আর্থ ইঞ্জিন ব্যবহার করার জন্য প্রয়োজনীয় স্ট্যান্ডার্ড ভূমিকা এবং অনুমতিগুলি ছাড়াও, কলকারীদের ক্লাউড প্রকল্প বা ডেটাসেটে সঠিক BigQuery অনুমতির প্রয়োজন৷
-
bigquery.tables.get
-
bigquery.tables.create
-
bigquery.tables.updateData
-
bigquery.tables.delete
-
bigquery.jobs.create
পূর্বনির্ধারিত আইডেন্টিটি এবং অ্যাক্সেস ম্যানেজমেন্ট (IAM) ভূমিকাগুলির নিম্নলিখিত সংমিশ্রণগুলির মধ্যে যেকোনও প্রয়োজনীয় অনুমতিগুলি অন্তর্ভুক্ত করে:
-
bigquery.dataEditor
প্লাসbigquery.jobUser
-
bigquery.dataOwner
প্লাসbigquery.jobUser
-
bigquery.user
-
bigquery.admin
মূল্য নির্ধারণ
BigQuery হল একটি অর্থপ্রদত্ত Google ক্লাউড পরিষেবা, তাই আপনি BigQuery-এ রপ্তানি করেন এমন যেকোন আর্থ ইঞ্জিন ডেটার স্টোরেজ এবং বিশ্লেষণ সহ আপনার BigQuery ব্যবহারের জন্য চার্জ দিতে হবে৷
আর্থ ইঞ্জিনের BigQuery রপ্তানি বৈশিষ্ট্যের জন্য মূল্যের বিশদ বিবরণের জন্য, নীচের মূল্য বিভাগটি দেখুন।
কনফিগারেশন রপ্তানি করুন
সিনট্যাক্স
Export.table.toBigQuery({
'collection': myFeatureCollection,
'table': 'myproject.mydataset.mytable',
'description': 'put_my_data_in_bigquery',
'append': true,
'overwrite': false
});
task = ee.batch.Export.table.toBigQuery(
collection=myFeatureCollection,
table='myproject.mydataset.mytable',
description='put_my_data_in_bigquery',
append=True,
overwrite=False)
task.start()
স্বয়ংক্রিয় বা ম্যানুয়াল স্কিমা স্পেসিফিকেশন
BigQuery-এ কোনো টেবিল না থাকলে, আর্থ ইঞ্জিন সংগ্রহের প্রথম ee.Feature
এর বৈশিষ্ট্য ব্যবহার করে একটি স্কিমা নির্ধারণ করার চেষ্টা করে। এটি একটি সর্বোত্তম অনুমান, এবং একটি সংগ্রহ তৈরি করা সম্ভব যেখানে প্রথম বৈশিষ্ট্যের স্কিমা অন্যান্য বৈশিষ্ট্যগুলির স্কিমা থেকে আলাদা৷
আপনার BigQuery টেবিলে একটি নির্দিষ্ট স্কিমার প্রয়োজন হলে, লক্ষ্য স্কিমা সহ একটি খালি টেবিল তৈরি করে এটি কনফিগার করুন।
সম্পত্তির নাম
আর্থ ইঞ্জিনের বৈশিষ্ট্যগুলি BigQuery-এর কলামগুলির সাথে মিলে যায়৷ আর্থ ইঞ্জিন BigQuery-এ ee.Feature
জ্যামিতি (".geo" নির্বাচক)।
কোনো নামকরণ এড়াতে, নিশ্চিত করুন যে আপনার ee.Feature
অবজেক্টে এমন বৈশিষ্ট্য রয়েছে যা বৈধ কলামের নাম এবং কোনোটির নাম "জিও" নেই (যেহেতু এই নামটি বৈশিষ্ট্যের জ্যামিতির জন্য ব্যবহৃত হয়, যার আর্থ ইঞ্জিনে কোনো নাম নেই)।
BigQuery কলামের নামগুলির উপর বিধিনিষেধের কারণে সম্পত্তির নামের অকার্যকর অক্ষর রপ্তানি ব্যর্থ করে দেয়।
টাইপ রূপান্তর
আর্থ ইঞ্জিন ( ee.Feature
বৈশিষ্ট্যের মান) ডেটা যখন সম্ভব তখন একটি সমতুল্য BigQuery টাইপে রূপান্তরিত হয়। মনে রাখবেন যে শূন্যতা টেবিল স্কিমা দ্বারা নিয়ন্ত্রিত হয়, প্রকার নয়।
আর্থ ইঞ্জিনের ধরন | BigQuery প্রকার | নোট |
---|---|---|
ee.String | STRING | |
ee.Number | FLOAT বা INTEGER | |
ee.Geometry | GEOGRAPHY | |
ee.Date | TIMESTAMP | |
ee.ByteString | BYTES | |
ee.Array | STRUCT<ARRAY<INT64>, ARRAY<INT64|FLOAT64>> | অ্যারে বিভাগ দেখুন |
অন্যান্য ee.* প্রকার | সমর্থিত নয় | JSON মানগুলির বিভাগটি দেখুন |
অ্যারে
আর্থ ইঞ্জিন যেকোন বহুমাত্রিক ee.Array
অ্যারেকে STRUCT<ARRAY<INT64> dimensions, ARRAY<INT64|FLOAT64> values>
রপ্তানি করে, যা BigQuery-এর ML.DECODE_IMAGE ফাংশন দ্বারা ব্যবহৃত ফর্ম্যাটের অনুরূপ।
কাঠামোর প্রথম অ্যারে, dimensions
, আর্থ ইঞ্জিন অ্যারের মাত্রা রয়েছে, d1 থেকে dn পর্যন্ত।
struct-এর দ্বিতীয় অ্যারে, values
, একটি একক BigQuery অ্যারেতে সমতল করা বহুমাত্রিক অ্যারের সমস্ত মান রয়েছে৷ সমতল অ্যারেতে মোট মানের সংখ্যা হল ∑ni=1di, এবং মূল আর্থ ইঞ্জিন অ্যারেতে (ii,…,in) সূচকের মান সমতল অ্যারেতে নিম্নলিখিত সূচকের মানের সাথে মিলে যায়:
n∑j=1(ij⋅n∏k=j+1dk)
সাধারণ ক্ষেত্রে, values
অ্যারের জন্য ইন্ডেক্সিং এক্সপ্রেশন নিম্নরূপ:
অ্যারের আকার | মাত্রা | ইন্ডেক্সিং এক্সপ্রেশন |
---|---|---|
1-মাত্রিক | d1 | [i1] |
2-মাত্রিক | d1, d2 | [(i1 * d2) + i2] |
3-মাত্রিক | d1, d2, d3 | [(i1 * d2 * d3) + (i2 * d3) + i3] |
উদাহরণস্বরূপ, একটি 2x3x4
আর্থ ইঞ্জিন অ্যারে বিবেচনা করুন:
ee.Array([
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
],
[
[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24]
]
]);
এই অ্যারেটি একটি BigQuery STRUCT
এ অনুবাদ করে যার dimensions
উপাদান হল অ্যারে [2, 3, 4]
এবং যার values
উপাদান হল সমতল অ্যারে [1, 2, 3, 4, 5, 6, 7, 8, ..., 21, 22, 23, 24]
। সমতল অ্যারের সূচীগুলি [(i1 * 12) + (i2 * 4) + i3]
হিসাবে গণনা করা যেতে পারে।
JSON মান
একটি কক্ষের মধ্যে আরও সমৃদ্ধভাবে স্ট্রাকচার্ড ডেটা সমর্থন করতে, আর্থ ইঞ্জিন মানগুলিকে JSON অবজেক্ট হিসাবে এনকোড করা সম্ভব৷ BigQuery JSON-এনকোড করা ডেটার উপর SQL অপারেশনকে সমর্থন করে, যা আপনি আর্থ ইঞ্জিনে তৈরি করা এনকোড করা JSON মানগুলির "ভিতরে দেখুন" এমন প্রশ্নের জন্য অনুমতি দেয়।
var states = ee.FeatureCollection('TIGER/2018/States'); var mod11a1 = ee.ImageCollection('MODIS/061/MOD11A1'); // Find the max day and night temperatures per pixel for a given time. var maxTemp = mod11a1 .select(['LST_Day_1km', 'LST_Night_1km']) .filterDate('2023-05-15', '2023-05-25') .max(); // Annotate each state with its max day/night temperatures. var annotatedStates = states.map(function (e) { var dict = maxTemp.reduceRegion({ reducer: ee.Reducer.max(), geometry: e.geometry(), scale: 10 * 1000, // 10 km }); // Convert the dictionary to JSON and add it as a property. return e.set('maxTemp', ee.String.encodeJSON(dict)); }); Export.table.toBigQuery(annotatedStates);
import ee import geemap.core as geemap
states = ee.FeatureCollection('TIGER/2018/States') mod11a1 = ee.ImageCollection('MODIS/061/MOD11A1') # Find the max day and night temperatures per pixel for a given time. max_temp = ( mod11a1.select(['LST_Day_1km', 'LST_Night_1km']) .filterDate('2023-05-15', '2023-05-25') .max() ) def get_max_temp_for_state(e): max_temp_dict = max_temp.reduceRegion( reducer=ee.Reducer.max(), geometry=e.geometry(), scale=10 * 1000, # 10 km ) # Convert the dictionary to JSON and add it as a property. return e.set('maxTemp', ee.String.encodeJSON(max_temp_dict)) # Annotate each state with its max day/night temperatures. annotated_states = states.map(get_max_temp_for_state) task = ee.batch.Export.table.toBigQuery( collection=annotated_states, table='myproject.mydataset.mytable' ) task.start()
জ্যামিতি রূপান্তর
BigQuery-এর বিভিন্ন অনুমানগুলির জন্য সীমিত সমর্থন রয়েছে, তাই সমস্ত আর্থ ইঞ্জিন জ্যামিতি 1 মিটারের একটি ত্রুটি মার্জিন ব্যবহার করে জিওডেসিক EPSG:4326
তে রূপান্তরিত হয়৷
এই রূপান্তর প্রক্রিয়াটির উপর সূক্ষ্ম নিয়ন্ত্রণের জন্য, আপনি বৈশিষ্ট্যগুলির উপর ম্যানুয়ালি ম্যাপ করতে পারেন এবং তাদের জ্যামিতিগুলিকে রূপান্তর করতে পারেন, যেমন:
var transformedCollection = originalCollection.map(function transformGeo(e) { var myErrorMargin = 10 * 1000; // meters return e.setGeometry(e.geometry(myErrorMargin, 'EPSG:4326', true)); });
import ee import geemap.core as geemap
def transform_geo(e): my_error_margin = 10 * 1000 # meters return e.setGeometry(e.geometry(my_error_margin, 'EPSG:4326', True)) transformed_collection = original_collection.map(transform_geo)
কর্মক্ষমতা
আর্থ ইঞ্জিন কর্মক্ষমতা
আর্থ ইঞ্জিন গণনা প্রায়শই Export
ক্রিয়াকলাপের জন্য বাধা হয়ে দাঁড়ায়। এই লক্ষ্যে, সর্বাধিক সমান্তরালতার জন্য আপনার প্রক্রিয়াকরণ সংগঠিত করা গুরুত্বপূর্ণ। সিরিয়াল প্রসেসিং-এ বেক করা যেকোন গণনা (উদাহরণস্বরূপ, ee.FeatureCollection.iterate()
) আপনার রপ্তানিকে ধীরে ধীরে চালাতে বা ব্যর্থ হতে পারে।
BigQuery-এ পারফরম্যান্স
BigQuery-এ কোয়েরিগুলিকে দক্ষ করে তোলা যায় তা নিশ্চিত করার জন্য সঠিকভাবে ডেটার স্ট্রাকচারিং এবং ক্লাস্টারিং হল সর্বোত্তম উপায়। BigQuery-এ আগে থেকে কোনও টেবিল না থাকলে, আর্থ ইঞ্জিন থেকে রপ্তানি করা টেবিলগুলি ফিচারের জ্যামিতিতে (যদি উপস্থিত থাকে) ক্লাস্টার করা হয়। ভূগোল ক্ষেত্রের দ্বারা ক্লাস্টারিং ভূ-স্থানিক ডেটার জন্য খুবই সাধারণ। এটি কর্মক্ষমতা উন্নত করে এবং স্থানিক ফিল্টার ব্যবহার করে এমন প্রশ্নের জন্য খরচ কমায়, সাধারণত BigQuery অপারেশনগুলির জন্য যেমন:
WHERE ST_DWithin(<table_column>, <constant_geography>, <distance>)
WHERE ST_Intersects(<table_column>, <constant_geography>)
গুচ্ছবিহীন টেবিলে ক্লাস্টারিং যোগ করলেও সাধারণত কোনো ক্ষতি হয় না, যদিও এটি টেবিলে ডেটা লোড করার সময় কিছুটা বাড়িয়ে দিতে পারে। কোয়েরি অপ্টিমাইজেশান সম্পর্কে আরও জানতে, BigQuery ডকুমেন্টেশন দেখুন।
মনে রাখবেন যে ক্লাস্টারিং সেটিংস শুধুমাত্র টেবিলে লেখা নতুন ডেটাকে প্রভাবিত করে।
ডেমো: reduceRegions
ব্যবহার করে
কিছু ক্ষেত্রে, আর্থ ইঞ্জিন প্রসেসিং অবকাঠামো থেকে যতটা সম্ভব সমান্তরালতা পেতে reduceRegions
ব্যবহার করা সম্ভব। এই উদাহরণটি দেখায় যে কীভাবে হাজার হাজার reduceRegion
কলের পরিবর্তে একটি ছোট সংখ্যক reduceRegions
কল (কয়েক শতাধিক) ব্যবহার করতে হয় (একটি সংগ্রহের উপর একটি ফাংশন ম্যাপ করার জন্য সাধারণ পদ্ধতি)।
var lucas = ee.FeatureCollection('JRC/LUCAS_HARMO/COPERNICUS_POLYGONS/V1/2018'); var s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED'); // Fetch the unique date values from the dataset. var dates = lucas.aggregate_array('survey_date') .distinct() .map(function (date) { return ee.Date.parse('dd/MM/yy', date); }); // For each date, annotate the LUCAS samples with the Sentinel-2 band values for // a two-week window. function getLucasSamplesForDate(date) { date = ee.Date(date); var imageForDate = s2 .filterDate( date.advance(-1, 'week'), date.advance(1, 'week')) .select('B.*'); var median = imageForDate.median(); var lucasForDate = lucas.filter( ee.Filter.equals('survey_date', date.format('dd/MM/yy'))); var sample = median.reduceRegions({ collection: lucasForDate, reducer: ee.Reducer.mean(), scale: 10, tileScale: 8, }); return sample; } // Flatten the collection. var withSamples = ee.FeatureCollection(dates.map(getLucasSamplesForDate)) .flatten(); Export.table.toBigQuery({ collection: withSamples, description: 'lucas_s2_annotated' });
import ee import geemap.core as geemap
lucas = ee.FeatureCollection('JRC/LUCAS_HARMO/COPERNICUS_POLYGONS/V1/2018') s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED') # Fetch the unique date values from the dataset. dates = ( lucas.aggregate_array('survey_date') .distinct() .map(lambda date: ee.Date.parse('dd/MM/yy', date)) ) # For each date, annotate the LUCAS samples with the Sentinel-2 band values for # a two-week window. def get_lucas_samples_for_date(date): date = ee.Date(date) image_for_date = s2.filterDate( date.advance(-1, 'week'), date.advance(1, 'week') ).select('B.*') median = image_for_date.median() lucas_for_date = lucas.filter( ee.Filter.equals('survey_date', date.format('dd/MM/yy')) ) sample = median.reduceRegions( collection=lucas_for_date, reducer=ee.Reducer.mean(), scale=10, tileScale=8, ) return sample # Flatten the collection. with_samples = ee.FeatureCollection( dates.map(get_lucas_samples_for_date) ).flatten() task = ee.batch.Export.table.toBigQuery( collection=with_samples, table='myproject.mydataset.mytable', description='lucas_s2_annotated', ) task.start()
টাস্ক সমান্তরালকরণ
{append: true}
বিকল্পের সাহায্যে, একাধিক কাজের জন্য একসাথে BigQuery টেবিলে ডেটা লেখা সম্ভব। এটি একটি উচ্চতর থ্রুপুট সহ ডেটা লেখার একটি প্রক্রিয়া, তবে এটি বর্ধিত জটিলতার খরচে আসে (টাস্ক কিউ পরিচালনা করা, পুনরায় চেষ্টা করা ইত্যাদি)।
append
এবং overwrite
পরামিতি মধ্যে কর্মক্ষমতা পার্থক্য
মনে রাখবেন যে ওভাররাইট করা সংযোজনের চেয়ে ধীর কারণ BigQuery-কে পুরানো ওভাররাইট করার আগে নতুন ডেটা প্রক্রিয়া করতে হবে। একটি বিদ্যমান BigQuery টেবিলে এক্সপোর্ট করার সময় {overwrite: true} প্যারামিটার সেট করা একটি নিরাপদ ওভাররাইট প্রক্রিয়া ট্রিগার করে:
- অস্থায়ী টেবিল: ডেটা গন্তব্য ডেটাসেটের মধ্যে একটি নতুন, অস্থায়ী টেবিলে রপ্তানি করা হয়।
- পারমাণবিক ওভাররাইট: অস্থায়ী টেবিলের বিষয়বস্তু চূড়ান্ত গন্তব্য টেবিলে অনুলিপি করা হয়, একটি একক, পারমাণবিক লেনদেনে বিদ্যমান ডেটা প্রতিস্থাপন করে।
- ক্লিনআপ: অস্থায়ী টেবিল মুছে ফেলা হয়েছে।
এটি নিশ্চিত করে যে রপ্তানির সময় ত্রুটিগুলি আপনার বিদ্যমান ডেটাকে দূষিত করবে না। ছোট টেবিলের জন্য, বিলম্ব সাধারণত কয়েক মিনিট হয়।
উচ্চ কর্মক্ষমতা বিকল্প
ওয়ার্কফ্লোগুলির জন্য যেগুলির জন্য খুব বেশি থ্রুপুট প্রয়োজন, আর্থ ইঞ্জিন থেকে BigQuery-এ ডেটা সরানোর জন্য GeoBeam ব্যবহার করার কথা বিবেচনা করুন৷ এর জন্য আরও কনফিগারেশন এবং অবকাঠামো প্রয়োজন, তাই আমরা বিল্ট-ইন আর্থ ইঞ্জিন কার্যকারিতা দিয়ে শুরু করার পরামর্শ দিই।
মূল্য নির্ধারণ
BigQuery-এ রপ্তানি করা একটি ব্যাচ প্রক্রিয়া যা ব্যাচ EECU-সময় খরচ করে। আপনি যদি আর্থ ইঞ্জিন বাণিজ্যিকভাবে বা কার্যক্ষমভাবে ব্যবহার করেন, তাহলে BigQuery-এ ডেটা রপ্তানি করার জন্য কাজগুলি ব্যবহার করা EECU-সময়ের জন্য আপনাকে চার্জ করে। সমস্ত ব্যবহার ঠিক একই মনিটরিং সরঞ্জাম দিয়ে পর্যবেক্ষণ করা যেতে পারে যা বাকি আর্থ ইঞ্জিনের জন্য কাজ করে।
ক্লাউড বিলিং অ্যাকাউন্ট
BigQuery-এ ডেটা লিখতে, সংশ্লিষ্ট ক্লাউড প্রজেক্টের একটি বিলিং অ্যাকাউন্ট সক্রিয় থাকতে হবে। বিলিং অ্যাকাউন্ট কনফিগারেশন সম্পর্কে আরও জানতে, ক্লাউড বিলিং অ্যাকাউন্ট ডক্স দেখুন।
প্রস্থান
সমস্ত প্রবেশ এবং প্রস্থান খরচ স্ট্যান্ডার্ড নেটওয়ার্ক ট্র্যাফিক হিসাবে চার্জ করা হয়।
আর্থ ইঞ্জিন শুধুমাত্র মার্কিন যুক্তরাষ্ট্রে হোস্ট করা হয়, কিন্তু BigQuery ডেটাসেটগুলি অন্যান্য অঞ্চলে হোস্ট করা যেতে পারে। জড়িত অঞ্চল এবং ডেটা ভলিউমের উপর নির্ভর করে, আর্থ ইঞ্জিন থেকে BigQuery-এ ডেটা লেখা যথেষ্ট নেটওয়ার্ক ট্র্যাফিক তৈরি করতে পারে।
পরিচিত সমস্যা
বড় বহুভুজের জন্য অভিযোজন
BigQuery রপ্তানি ফাংশন একটি গোলার্ধের চেয়ে বড় বহুভুজকে তাদের অভিযোজন বিপরীত করে (বহুভুজটিকে তার জ্যামিতিক পরিপূরক হিসাবে পরিবর্তন করে) উল্টে দেয়। বিরল ক্ষেত্রে, একটি গোলার্ধের চেয়ে বড় বহুভুজ লোড হতে ব্যর্থ হতে পারে।
প্রয়োজনে, উল্টানো বহুভুজগুলিকে BigQuery-এর মধ্যে আবার উল্টিয়ে সংশোধন করা যেতে পারে, BigQuery এক্সপ্রেশন ST_Difference(ST_GeogFromText('fullglobe'), geo)
ব্যবহার করে।
আরও তথ্যের জন্য, এখানে দেখুন।