BigQuery से डेटा पढ़ना

इस पेज पर, BigQuery टेबल को Earth Engine वर्कफ़्लो में ee.FeatureCollection ऑब्जेक्ट के तौर पर इंटिग्रेट करने का तरीका बताया गया है. इसके लिए, ee.FeatureCollection.loadBigQueryTable() और ee.FeatureCollection.runBigQuery() तरीकों का इस्तेमाल किया जाता है.

BigQuery से डेटा लोड करना

ee.FeatureCollection.loadBigQueryTable() फ़ंक्शन, BigQuery टेबल को ee.FeatureCollection ऑब्जेक्ट में आसानी से पढ़ता है. यह किसी टेबल से कनेक्ट होता है, सभी डेटा टाइप को बदलता है, ज़रूरी फ़िल्टर और सिलेक्टर लागू करता है, और ज़रूरत पड़ने पर कलेक्शन में इंडेक्सिंग जोड़ता है. यह फ़ंक्शन, Earth Engine के इंटरैक्टिव एनवायरमेंट का इस्तेमाल करता है. साथ ही, नतीजों को सीधे तौर पर क्लाइंट को दिखाता है, ताकि उन्हें देखा जा सके या किसी बड़ी एनालिसिस के कॉम्पोनेंट के तौर पर इस्तेमाल किया जा सके.

JavaScript

// Load the BigQuery table with a specified geometry column.
var features = ee.FeatureCollection.loadBigQueryTable({
  table: 'my_project.my_dataset.my_table',
  geometryColumn: 'geo'
});

// Display features on the map.
Map.addLayer(features);
      

Python

# Load the BigQuery table with a specified geometry column.
features = ee.FeatureCollection.loadBigQueryTable(
    table='my_project.my_dataset.my_table',
    geometryColumn='geo')

# Display the first feature.
display(features.first().getInfo())
      

बिलिंग

अनुरोध को प्रोसेस करने के दौरान इस्तेमाल किए गए EECU-घंटों का शुल्क, कॉल करने वाले व्यक्ति से लिया जाता है. यह शुल्क, Earth Engine के किसी अन्य तरीके के लिए भी लिया जाता है. EECU की खास जानकारी देखें.

डेटा को Earth Engine में ट्रांसफ़र करने पर, BigQuery के लिए कोई अतिरिक्त शुल्क नहीं लगता. BigQuery के इस्तेमाल से जुड़ा डेटा, इस्तेमाल किए गए प्रोजेक्ट के Google Cloud API डैशबोर्ड में दिखेगा. API के इस्तेमाल को मॉनिटर करना लेख पढ़ें. हालांकि, इस तरह से BigQuery डेटा को पढ़ने के लिए कोई शुल्क नहीं लिया जाएगा.

BigQuery से डेटा क्वेरी करना

ee.FeatureCollection.runBigQuery() मेथड, BigQuery एसक्यूएल क्वेरी चलाता है और नतीजों को ee.FeatureCollection ऑब्जेक्ट के तौर पर दिखाता है. क्वेरी के बारे में ज़्यादा जानने के लिए, क्वेरी चलाने से जुड़ा दस्तावेज़ देखें.

JavaScript

// Construct a BigQuery query.
var query = 'SELECT * FROM my_project.my_dataset.my_table WHERE column > 1000';

// Run the query and return the results as a FeatureCollection.
var features = ee.FeatureCollection.runBigQuery(query);

// Print the first feature.
print(features.first());
      

Python

# Construct a BigQuery query.
query = 'SELECT * FROM my_project.my_dataset.my_table WHERE column > 1000'

# Run the query and retrieve the results as a FeatureCollection.
features = ee.FeatureCollection.runBigQuery(query)

# Print the first feature.
print(features.first().getInfo())
      

BigQuery क्वेरी

ee.FeatureCollection.runBigQuery() को हर कॉल से, एक अलग BigQuery क्वेरी जॉब शुरू होता है. क्वेरी के बारे में ज़्यादा जानने के लिए, क्वेरी चलाने से जुड़े दस्तावेज़ पढ़ें. इससे आपको BigQuery की मुख्य सुविधाओं का इस्तेमाल करने की अनुमति मिलती है:

  • जॉब का इतिहास: अपने प्रोजेक्ट की क्वेरी के छह महीने के इतिहास को ऐक्सेस करें. ज़्यादा जानकारी के लिए, जॉब की सूची देखें.
  • क्वेरी के नतीजे कैश मेमोरी में सेव करना: BigQuery, क्वेरी के नतीजों को अपने-आप कैश मेमोरी में सेव करता है. एक जैसी क्वेरी के लिए, कैश मेमोरी से डेटा वापस मिलता है. इससे, एक ही क्वेरी के लिए बार-बार शुल्क नहीं लगता. ज़्यादा जानकारी के लिए, क्वेरी के कैश मेमोरी में सेव किए गए नतीजों का इस्तेमाल करना लेख पढ़ें

क्वेरी के बारे में जानने या BigQuery में उनका इस्तेमाल करने का तरीका जानने के लिए, BigQuery का दस्तावेज़ पढ़ें.

बिलिंग

अनुरोध को प्रोसेस करने के दौरान इस्तेमाल किए गए ईईसीयू की लागत, कॉल करने वाले व्यक्ति को बिल की जाती है. यह लागत, Earth Engine के किसी अन्य तरीके के लिए भी लागू होती है. इसके बारे में जानने के लिए, ईईसीयू की खास जानकारी देखें. इसके अलावा, BigQuery के बिलिंग मॉडल के मुताबिक, क्वेरी चलाने का शुल्क कॉलर से लिया जाता है.

डेटा को Earth Engine में ट्रांसफ़र करने पर, BigQuery के लिए कोई अतिरिक्त शुल्क नहीं लगता. BigQuery के इस्तेमाल से जुड़ा डेटा, इस्तेमाल किए गए प्रोजेक्ट के Google Cloud API डैशबोर्ड में दिखेगा. API के इस्तेमाल को मॉनिटर करना लेख पढ़ें. हालांकि, इस तरह से BigQuery डेटा को पढ़ने के लिए कोई शुल्क नहीं लिया जाएगा.

ee.FeatureCollection.runBigQuery() से जुड़ी संभावित लागत को कंट्रोल करने के लिए, maxBytesBilled पैरामीटर सुरक्षा के तौर पर काम करता है. इस सीमा से ज़्यादा साइज़ वाला कोई भी BigQuery जॉब पूरा नहीं हो पाएगा. साथ ही, इसके लिए बिल नहीं भेजा जाएगा. maxBytesBilled की डिफ़ॉल्ट वैल्यू 100 जीबी होती है. अगर इस सीमा से ज़्यादा कॉल करने की वजह से कॉल ब्लॉक कर दिया जाता है, तो अपनी स्क्रिप्ट में कोई दूसरी वैल्यू तय की जा सकती है.

ज़रूरी शर्तें और अनुमतियां

इस सुविधा का इस्तेमाल करने के लिए, कॉल करने वाले के Cloud प्रोजेक्ट में BigQuery API और BigQuery Storage API चालू होना चाहिए. सही एपीआई चालू करने के लिए, 'एपीआई चालू करें' पेज पर दिए गए निर्देशों का पालन करें.

Earth Engine की स्टैंडर्ड भूमिकाओं और अनुमतियों के अलावा, आपके पास रेफ़र की गई BigQuery टेबल को पढ़ने का ऐक्सेस होना चाहिए. साथ ही, टारगेट प्रोजेक्ट में पढ़ने के सेशन और जॉब बनाने की अनुमति होनी चाहिए. BigQuery की ये अनुमतियां ज़रूरी हैं:

  • bigquery.tables.get (ऐक्सेस की गई किसी भी टेबल पर)
  • bigquery.tables.getData (ऐक्सेस की गई किसी भी टेबल पर)
  • bigquery.readSession.create
  • bigquery.jobs.create

अनुमतियां मैनेज करने के बारे में ज़्यादा जानने के लिए, BigQuery के ऐक्सेस कंट्रोल से जुड़े दस्तावेज़ पढ़ें.

डेटा को फ़िल्टर करना

.filter(Filter) तरीके का इस्तेमाल करके, हर ee.FeatureCollection को फ़िल्टर किया जा सकता है. Google Earth Engine के उपयोगकर्ताओं को, BigQuery की मदद से टेबल के डेटा को तेज़ी से प्रोसेस करने की सुविधा देने के लिए, हम Earth Engine के फ़िल्टर को BigQuery की भाषा में बदलते हैं. इसके बाद, हम उन्हें टेबल से डेटा पढ़ने के अनुरोध के साथ भेजते हैं. इस तरीके से, फ़िल्टर को प्रोसेस करने की सुविधा BigQuery स्टैक में ट्रांसफ़र हो जाती है. हालांकि, इसमें दो सीमाएं भी हैं:

  1. BigQuery में मौजूद हर दूसरी क्वेरी की तरह (BigQuery के कोटे देखें), इस अनुरोध का साइज़ 10 एमबी से ज़्यादा नहीं होना चाहिए. इसका मतलब है कि पास किए गए फ़िल्टर बहुत ज़्यादा जटिल नहीं होने चाहिए. 10 एमबी की सीमा पार करने पर, यह गड़बड़ी दिखती है:

    Filter sent to BigQuery is too long. This error may be caused by too complicated geometry in geometry filters. Consider simplifying the filter and used values.

    इस गड़बड़ी की एक आम वजह, ऐसी ज्यामिति के हिसाब से फ़िल्टर करना है जिनमें कई वर्टेक्स शामिल हैं. इस समस्या को हल करने के लिए, समस्या वाले ऑब्जेक्ट पर ee.Geometry.simplify() का इस्तेमाल करें.

  2. Earth Engine के कुछ ज़्यादा जटिल फ़िल्टर को BigQuery के फ़िल्टर में नहीं बदला जा सकता. उदाहरण के लिए, BigQuery में ARRAY की समानता की जांच नहीं की जा सकती. ऐसे मामलों में, हम फ़िल्टर का अनुवाद नहीं करते हैं. इसके बजाय, डेटा पढ़ने के बाद इसे Earth Engine में लागू करते हैं.

डेटा इंडेक्स करना

Earth Engine कलेक्शन, इंटरनल इंडेक्सिंग पर निर्भर करते हैं. वहीं, BigQuery में टेबल को इंडेक्स करने से बचने का सुझाव दिया जाता है. इन दोनों सिस्टम को एक साथ काम करने के लिए, हम इस तरह कलेक्शन इंडेक्स बनाते हैं:

  • अगर BigQuery टेबल में system:index नाम का कॉलम मौजूद है, तो हम इसका इस्तेमाल FeatureCollection को इंडेक्स करने के लिए करते हैं.

    ऐसे मामलों में, यह कॉलर की ज़िम्मेदारी होती है कि वह यह पक्का करे कि इंडेक्स यूनीक हों. ऐसा न करने पर, हो सकता है कि कलेक्शन अनचाहे तरीके से काम करे. फ़ीचर इंडेक्स खाली नहीं छोड़ा जा सकता. इसलिए, BigQuery टेबल को बिना स्ट्रिंग या null वैल्यू वाले system:index कॉलम के साथ लोड नहीं किया जा सकेगा.

  • अगर BigQuery टेबल में system:index कॉलम नहीं है, तो यह अपने-आप जनरेट हो जाता है.

    दो रीड अनुरोधों के बीच इंडेक्स स्थिर होते हैं. हालांकि, ऐसा सिर्फ़ तब होता है, जब फ़िल्टर को ध्यान में रखते हुए अनुरोध बिलकुल एक जैसे हों. ऐसा न होने पर, हम इंडेक्स पर भरोसा नहीं कर सकते कि वे एक जैसी सुविधाओं के लिए हैं. इसलिए, अगर कॉल करने वाले व्यक्ति के लिए सटीक और यूनीक डेटा इंडेक्स करना ज़रूरी है, तो हमारा सुझाव है कि वह BigQuery में system:index कॉलम को मैन्युअल तरीके से जोड़े.

सीमाएं

  • ee.FeatureCollection.loadBigQueryTable() कॉल में रेफ़र की गई टेबल के चुने गए सभी कॉलम का साइज़ 400 जीबी से ज़्यादा नहीं होना चाहिए. इस सीमा तक पहुंचने पर, यह गड़बड़ी दिखेगी:

    Failed to read table from BigQuery: Requested data size is too large to read. Consider using selectors to specify only required columns.

    ऐसे मामलों में, सिर्फ़ ज़रूरी कॉलम को पढ़ने के लिए, ज़्यादा पाबंदी वाले सिलेक्टर चुनें. इसके अलावा, BigQuery में टेबल को पहले से प्रोसेस करने और फ़ेच किए गए डेटा की मात्रा को कम करने के लिए, ee.FeatureCollection.runBigQuery() का इस्तेमाल करें.

  • ee.FeatureCollection.runBigQuery() मेथड, क्वेरी के नतीजों के साइज़ पर 10 जीबी की सीमा लगाता है. हालांकि, सोर्स टेबल का साइज़ कुछ भी हो सकता है. हालांकि, ज़्यादा डेटा प्रोसेस करने से क्वेरी की लागत बढ़ जाएगी.

  • अनुवाद किए गए फ़िल्टर का साइज़ 10 एमबी से ज़्यादा नहीं होना चाहिए. ज़्यादा जानकारी के लिए, डेटा फ़िल्टर करना सेक्शन देखें.

  • Earth Engine ऐप्लिकेशन के साथ, ee.FeatureCollection.loadBigQueryTable() या ee.FeatureCollection.runBigQuery() का इस्तेमाल नहीं किया जा सकता.

चेतावनियां

  • ee.FeatureCollection.loadBigQueryTable(), लिंक किए गए डेटासेट के संसाधनों के साथ काम नहीं करता. ऐसी टेबल से डेटा लोड करने की कोशिश करने पर, "टेबल नहीं मिली" गड़बड़ी का मैसेज दिखता है.

    इसके बजाय, लिंक किए गए डेटासेट से अनुरोध की गई टेबल के बारे में बताने वाली क्वेरी के साथ ee.FeatureCollection.runBigQuery() चलाएं. उदाहरण के लिए:

    JavaScript

    var features = ee.FeatureCollection.runBigQuery({
      query: 'SELECT * FROM my_project.my_linked_dataset.my_table',
      geometryColumn: 'geo'
    });
          

    Python

    features = ee.FeatureCollection.runBigQuery(
      query='SELECT * FROM my_project.my_linked_dataset.my_table',
      geometryColumn='geo')
          
  • ऑटोमैटिक तरीके से जनरेट होने वाले आईडी वाली BigQuery टेबल के लिए, system:index पर शामिल होने से, अनचाहे नतीजे मिल सकते हैं. ऐसा होने से रोकने के लिए, BigQuery टेबल में मैन्युअल तरीके से system:index जोड़ें या टेबल को किसी दूसरी प्रॉपर्टी से जोड़ें. डेटा इंडेक्सिंग सेक्शन में इंडेक्सिंग के बारे में ज़्यादा पढ़ें.

  • ee.FeatureCollection.randomColumn() मेथड, BigQuery के अपने-आप जनरेट होने वाले आईडी के साथ काम नहीं करता. ee.FeatureCollection.randomColumn() तरीके में rowKeys पैरामीटर का इस्तेमाल करके, किसी दूसरी कुंजी को तय करें. BigQuery सोर्स टेबल में, random या system:index कॉलम को मैन्युअल तरीके से भी जोड़ा जा सकता है. डेटा इंडेक्सिंग सेक्शन में इंडेक्सिंग के बारे में ज़्यादा पढ़ें.