BigQuery'ye aktarma

Genel Bakış

Earth Engine'ın hesaplama mimarisi, görüntü (piksel tabanlı) hesaplamayı hızlı ve ölçeklenebilir hale getirmek için optimize edilmiştir. BigQuery, tablo verilerinin (vektörler) ölçeklenebilir şekilde işlenmesi için benzer şekilde optimize edilmiştir ve Earth Engine'ı tamamlayan birçok özelliğe sahiptir.

Örnek iş akışları şunlardır:

  • Earth Engine'da oluşturulan veriler üzerinde büyük BigQuery birleştirme işlemleri gerçekleştirme
  • BigQuery'de daha fazla işleme tabi tutulması için vektör verilerini görüntülerden elde edilen istatistiklerle notlandırma
  • Earth Engine'dan verileri düzenli olarak eklenebilir bir BigQuery tablosuna aktarma

Başka harika kullanım alanlarınız varsa bize bildirin.

BigQuery ile ilgili temel bilgiler

Earth Engine, BigQuery tablolarına yazar ve tüm tablolar veri kümelerinde bulunur. Belirtilen veri kümesi BigQuery'de yoksa dışa aktarma görevleri başarısız olur. Daha fazla bilgi için BigQuery veri kümesi girişi başlıklı makaleyi inceleyin.

Veri kümesi oluşturma

Veri kümelerinde ad, depolama alanı bölgesi ve geçerlilik süresi davranışı (diğer bazı daha gelişmiş seçeneklerle birlikte) gibi çeşitli oluşturma zamanı seçenekleri bulunur.

Veri kümesi oluşturmak için çeşitli mekanizmalar vardır ancak başlamanın basit bir yolu Cloud Console'dur:

  1. Cloud Console'daki BigQuery sayfasına gidin.
  2. İstenirse API'yi etkinleştirmek için "Etkinleştir"i tıklayın.
  3. "SQL Çalışma Alanı" sekmesinde, projenin yanındaki üç noktalı menüyü () tıklayın.
  4. "Veri kümesi oluştur" seçeneğini belirleyin.
  5. Yapılandırma kılavuzunu uygulayın.

Veri kümesi oluşturma ve yapılandırmayla ilgili tüm seçenekler için BigQuery belgelerine bakın.

İzinler

Earth Engine'u kullanmak için gereken standart rollere ve izinlere ek olarak, Cloud projesi veya veri kümesinde doğru BigQuery izinlerine de sahip olmanız gerekir.

  • bigquery.tables.get
  • bigquery.tables.create
  • bigquery.tables.updateData
  • bigquery.tables.delete
  • bigquery.jobs.create

Aşağıdaki önceden tanımlanmış Identity and Access Management (IAM) rol kombinasyonlarından herhangi biri gerekli izinleri içerir:

  • bigquery.dataEditor + bigquery.jobUser
  • bigquery.dataOwner + bigquery.jobUser
  • bigquery.user
  • bigquery.admin

Fiyatlandırma

BigQuery, ücretli bir Google Cloud hizmetidir. Bu nedenle, BigQuery'ye aktardığınız tüm Earth Engine verilerinin depolanması ve analizi de dahil olmak üzere BigQuery kullanımınızdan ücret alınır.

Earth Engine'ın BigQuery dışa aktarma özelliğinin fiyatlandırması hakkında ayrıntılı bilgi için aşağıdaki fiyatlandırma bölümüne bakın.

Yapılandırmayı dışa aktar

Söz dizimi

  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()

Otomatik veya manuel şema tanımı

BigQuery'de tablo yoksa Earth Engine, koleksiyondaki ilk ee.Feature öğesinin özelliklerini kullanarak bir şema belirlemeye çalışır. Bu, en iyi tahmindir. İlk özelliğin şemasının diğer özelliklerin şemasından farklı olduğu bir koleksiyon oluşturabilirsiniz.

BigQuery tablonuzda belirli bir şema kullanmanız gerekiyorsa hedef şemayla boş bir tablo oluşturarak tabloyu yapılandırın.

Mülk adları

Earth Engine özelliklerindeki mülkler, BigQuery'deki sütunlara karşılık gelir. Earth Engine, ee.Feature geometrisini (".geo" seçicisini) BigQuery'ye yazmak için "geo" adını kullanır.

Yeniden adlandırmayı önlemek için ee.Feature nesnelerinizin geçerli sütun adlarına sahip olduğundan ve hiçbirinin "geo" olarak adlandırılmadığından emin olun (bu ad, Earth Engine'da adı olmayan öğenin geometrisi için kullanılır).

Mülk adlarında geçersiz karakterler olması, BigQuery sütun adlarıyla ilgili kısıtlamalar nedeniyle dışa aktarma işleminin başarısız olmasına neden olur.

Tür dönüştürme

Earth Engine (ee.Feature mülklerinin değerleri) verileri mümkün olduğunda eşdeğer bir BigQuery türüne dönüştürülür. Boş bırakılabilirliğin türün değil, tablo şemasının kontrol ettiğini unutmayın.

Earth Engine türü BigQuery türü Notlar
ee.String STRING
ee.Number FLOAT veya INTEGER
ee.Geometry GEOGRAPHY
ee.Date TIMESTAMP
ee.ByteString BYTES
ee.Array STRUCT<ARRAY<INT64>, ARRAY<INT64|FLOAT64>> Diziler bölümüne bakın.
Diğer ee.* türleri desteklenmiyor JSON değerleri bölümüne bakın

Diziler

Earth Engine, BigQuery'nin ML.DECODE_IMAGE işlevi tarafından kullanılan biçime benzer şekilde tüm çok boyutlu ee.Array öğelerini STRUCT<ARRAY<INT64> dimensions, ARRAY<INT64|FLOAT64> values> olarak dışa aktarır.

Yapıdaki ilk dizi (dimensions), Earth Engine dizisinin boyutlarını (d1 ile dn arasında) içerir.

Yapıdaki ikinci dizi (values), çok boyutlu dizideki tüm değerleri tek bir BigQuery dizisine düzleştirilmiş şekilde içerir. Düzleştirilmiş dizindeki toplam değer sayısı ni=1di'dir ve orijinal Earth Engine dizisindeki (ii,,in) dizinindeki değer, düzleştirilmiş dizindeki aşağıdaki dizinde bulunan değere karşılık gelir:

nj=1(ijnk=j+1dk)

Genel durumlarda, values dizisi için dizine ekleme ifadesi aşağıdaki gibidir:

Dizi Boyutu Ölçüler Dizine ekleme ifadesi
1 boyutlu d1 [i1]
2 boyutlu d1, d2 [(i1 * d2) + i2]
3 boyutlu d1, d2, d3 [(i1 * d2 * d3) + (i2 * d3) + i3]

Örneğin, bir 2x3x4 Earth Engine dizisini ele alalım:

    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]
      ]
    ]);

Bu dizi, dimensions öğesi [2, 3, 4] dizisi ve values öğesi düzleştirilmiş [1, 2, 3, 4, 5, 6, 7, 8, ..., 21, 22, 23, 24] dizisi olan bir BigQuery STRUCT öğesine dönüştürülür. Düzleştirilmiş dizideki dizinler [(i1 * 12) + (i2 * 4) + i3] olarak hesaplanabilir.

JSON değerleri

Hücre içinde daha zengin yapılandırılmış verileri desteklemek için Earth Engine değerlerini JSON nesneleri olarak kodlayabilirsiniz. BigQuery, JSON olarak kodlanmış veriler üzerinde SQL işlemlerini destekler. Bu sayede, Earth Engine'da oluşturduğunuz kodlanmış JSON değerlerinin "içine bakabilen" sorgular oluşturabilirsiniz.

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);

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

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()

Geometri dönüşümü

BigQuery, farklı projeksiyonlar için sınırlı destek sunar. Bu nedenle, tüm Earth Engine geometrileri 1 metrelik bir hata payı kullanılarak jeodezik EPSG:4326 olarak dönüştürülür.

Bu dönüşüm süreci üzerinde daha ayrıntılı kontrol sahibi olmak için özellikleri manuel olarak eşleyebilir ve geometrilerini dönüştürebilirsiniz. Örneğin:

var transformedCollection = originalCollection.map(function transformGeo(e) {
  var myErrorMargin = 10 * 1000;  // meters
  return e.setGeometry(e.geometry(myErrorMargin, 'EPSG:4326', true));
});

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

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)

Performans

Earth Engine performansı

Earth Engine hesaplaması genellikle Export işlemlerinin darboğazıdır. Bu nedenle, işleminizi maksimum paralellik için düzenlemeniz önemlidir. Seri işleme sırasında oluşturulan tüm hesaplamalar (örneğin, ee.FeatureCollection.iterate()), dışa aktarma işleminizin yavaş çalışmasına veya başarısız olmasına neden olabilir.

BigQuery'de performans

Verileri doğru şekilde yapılandırma ve kümeleme, BigQuery'de sorguların verimli bir şekilde yapılabilmesini sağlamanın en iyi yoludur. BigQuery'de halihazırda bir tablo yoksa Earth Engine'dan aktarılan tablolar, özelliklerin geometrisine göre (varsa) kümelendirilir. Coğrafi konum alanına göre gruplandırma, coğrafi verilerde çok yaygındır. En yaygın olarak aşağıdaki gibi BigQuery işlemleri için kullanılan mekansal filtreleri kullanan sorguların performansını artırır ve maliyetini düşürür:

WHERE ST_DWithin(<table_column>, <constant_geography>, <distance>)
WHERE ST_Intersects(<table_column>, <constant_geography>)

Gruplandırılmamış bir tabloya gruplandırma eklemek genellikle herhangi bir zarara neden olmaz ancak tabloya veri yükleme süresini biraz artırabilir. Sorgu optimizasyonu hakkında daha fazla bilgi için BigQuery belgelerine bakın.

Küme oluşturma ayarlarının yalnızca tabloya yazılan yeni verileri etkilediğini unutmayın.

Demo: reduceRegions kullanılıyor

Bazı durumlarda, Earth Engine işleme altyapısından mümkün olduğunca fazla paralellik elde etmek için reduceRegions kullanılabilir. Bu örnekte, on binlerce reduceRegion çağrısı (bir koleksiyon üzerinde işlev eşleme için tipik yaklaşım) yerine daha az sayıda reduceRegions çağrısının (birkaç yüz) nasıl kullanılacağı gösterilmektedir.

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'
});

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

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()

Görev paralelleştirme

{append: true} seçeneğiyle, birden fazla görevin bir BigQuery tablosuna eşzamanlı olarak veri yazması mümkündür. Bu, daha yüksek bir veri çıkışıyla veri yazmak için kullanılan bir mekanizmadır ancak karmaşıklığın artması (ör. görev kuyruğunu yönetme, yeniden deneme) pahasına kullanılır.

append ve overwrite parametreleri arasındaki performans farklılıkları

BigQuery'nin eski verilerin üzerine yazmadan önce yeni verileri işlemesi gerektiğinden, üzerine yazma işleminin ekleme işleminden daha yavaş olduğunu unutmayın. Mevcut bir BigQuery tablosuna dışa aktarma işlemi sırasında {overwrite: true} parametresini ayarlamak güvenli bir üzerine yazma işlemi tetikler:

  1. Geçici tablo: Veriler, hedef veri kümesinde yeni ve geçici bir tabloya aktarılır.
  2. Atomik üzerine yazma: Geçici tablonun içeriği, nihai hedef tabloya kopyalanır ve mevcut veriler tek bir atomik işlemle değiştirilir.
  3. Temizleme: Geçici tablo silinir.

Bu sayede, dışa aktarma sırasında oluşan hatalar mevcut verilerinizi bozmaz. Küçük tablolarda gecikme genellikle birkaç dakikadır.

Yüksek performanslı alternatifler

Çok yüksek veri akışı gerektiren iş akışları için verileri Earth Engine'dan BigQuery'ye taşımak üzere GeoBeam'i kullanabilirsiniz. Bu işlem daha fazla yapılandırma ve altyapı gerektirdiğinden, yerleşik Earth Engine işlevini kullanmaya başlamanızı öneririz.

Fiyatlandırma

BigQuery'ye aktarma işlemi, toplu EECU süresini kullanan bir toplu işlemdir. Earth Engine'ı ticari veya operasyonel olarak kullanıyorsanız verileri BigQuery'ye aktardığınızda görevler tarafından kullanılan EECU süresi için ücretlendirilirsiniz. Tüm kullanımlar, Earth Engine'ın geri kalanında kullanılan izleme araçlarıyla tam olarak aynı şekilde izlenebilir.

Cloud faturalandırma hesapları

BigQuery'ye veri yazmak için ilişkili Cloud projesinde faturalandırma hesabının etkinleştirilmesi gerekir. Faturalandırma hesabı yapılandırması hakkında daha fazla bilgi edinmek için Cloud Billing hesabı belgelerine bakın.

Çıkış

Tüm giriş ve çıkış maliyetleri standart ağ trafiği olarak ücretlendirilir.

Earth Engine yalnızca ABD'de barındırılır ancak BigQuery veri kümeleri birçok başka bölgede barındırılabilir. İlgili bölgelere ve veri hacimlerine bağlı olarak, Earth Engine'dan BigQuery'ye veri yazmak önemli miktarda ağ trafiği oluşturabilir.

Bilinen sorunlar

Büyük poligonlar için yön

BigQuery dışa aktarma işlevi, yarım küreden büyük poligonların yönünü tersine çevirerek (poligonu geometrik tamamlayıcısına dönüştürerek) poligonları ters çevirir. Nadiren de olsa yarım küreden büyük poligonlar yüklenmeyebilir.

Gerekirse tersine çevrilmiş poligonlar, BigQuery ifadesi ST_Difference(ST_GeogFromText('fullglobe'), geo) kullanılarak tekrar tersine çevrilerek BigQuery'de düzeltilebilir.

Daha fazla bilgi için burayı ziyaret edin.