Mengekspor data ke Spanner (ETL terbalik)

Dokumen ini menjelaskan cara menyiapkan alur kerja ekstraksi, transformasi, dan pemuatan terbalik (ETL terbalik) dari BigQuery ke Spanner. Anda dapat melakukannya dengan menggunakan pernyataan EXPORT DATA untuk mengekspor data dari sumber data BigQuery, termasuk tabel Iceberg, ke tabel Spanner.

Alur kerja ETL terbalik ini menggabungkan kemampuan analisis di BigQuery dengan latensi rendah dan throughput tinggi di Spanner. Alur kerja ini memungkinkan Anda menyajikan data kepada pengguna aplikasi tanpa menghabiskan kuota dan batas di BigQuery.

Sebelum memulai

Peran yang diperlukan

Untuk mendapatkan izin yang Anda perlukan guna mengekspor data BigQuery ke Spanner, minta administrator Anda untuk memberi Anda peran IAM berikut di project Anda:

Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses ke project, folder, dan organisasi.

Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

Batasan

  • Fitur ini tidak didukung di Assured Workloads.

  • Jenis data BigQuery berikut tidak memiliki padanan di Spanner dan tidak didukung:

Dialek database Spanner Jenis BigQuery yang tidak didukung
Semua dialek
  • STRUCT
  • GEOGRAPHY
  • DATETIME
  • RANGE
  • TIME
GoogleSQL
  • BIGNUMERIC: Jenis NUMERIC yang didukung tidak cukup lebar. Pertimbangkan untuk menambahkan transmisi eksplisit ke jenis NUMERIC dalam kueri.
  • Ukuran maksimum baris yang diekspor tidak boleh melebihi 1 MiB.

  • Spanner menerapkan integritas referensial selama ekspor. Jika tabel target adalah turunan dari tabel lain (INTERLEAVE IN PARENT), atau jika tabel target memiliki batasan kunci asing, kunci asing dan kunci induk akan divalidasi selama ekspor. Jika baris yang diekspor ditulis ke tabel dengan INTERLEAVE IN PARENT dan baris induk tidak ada, ekspor akan gagal dengan pesan "Baris induk tidak ada. Error "Baris tidak dapat ditulis". Jika baris yang diekspor ditulis ke tabel dengan batasan kunci asing dan mereferensikan kunci yang tidak ada, ekspor akan gagal dengan error "Foreign key constraint is violated". Saat mengekspor ke beberapa tabel, sebaiknya urutkan ekspor untuk memastikan integritas referensial akan dipertahankan selama ekspor. Hal ini biasanya berarti mengekspor tabel induk dan tabel yang direferensikan oleh kunci asing sebelum tabel yang mereferensikannya.

    Jika tabel yang menjadi target ekspor memiliki batasan kunci asing, atau merupakan turunan dari tabel lain (INTERLEAVE IN PARENT), tabel induk harus diisi sebelum ekspor tabel turunan, dan harus berisi semua kunci yang sesuai. Upaya untuk mengekspor tabel turunan saat tabel induk tidak memiliki kumpulan lengkap kunci yang relevan akan gagal.

  • Tugas BigQuery, seperti tugas ekstrak ke Spanner, memiliki durasi maksimum 6 jam. Untuk mengetahui informasi tentang cara mengoptimalkan tugas ekstraksi besar, lihat Pengoptimalan ekspor. Sebagai alternatif, pertimbangkan untuk membagi input menjadi blok data individual, yang dapat diekspor sebagai tugas ekstraksi individual.

  • Ekspor ke Spanner hanya didukung untuk edisi BigQuery Enterprise atau Enterprise Plus. Edisi Standar BigQuery dan komputasi on-demand tidak didukung.

  • Anda tidak dapat menggunakan kueri berkelanjutan untuk mengekspor ke tabel Spanner dengan kunci utama yang dibuat otomatis.

  • Anda tidak dapat menggunakan kueri berkelanjutan untuk mengekspor ke tabel Spanner dalam database dialek PostgreSQL.

  • Saat menggunakan kueri berkelanjutan untuk mengekspor ke tabel Spanner, pastikan Anda memilih kunci utama yang tidak sesuai dengan bilangan bulat yang meningkat secara monoton di tabel BigQuery Anda. Melakukannya dapat menyebabkan masalah performa dalam ekspor Anda. Untuk mengetahui informasi tentang kunci utama di Spanner, dan cara memitigasi masalah performa ini, lihat Memilih kunci utama.

Mengonfigurasi ekspor dengan opsi spanner_options

Anda dapat menggunakan opsi spanner_options untuk menentukan tabel dan database Spanner tujuan. Konfigurasi dinyatakan dalam bentuk string JSON, seperti yang ditunjukkan contoh berikut:

EXPORT DATA OPTIONS(
   uri="https://spanner.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID",
  format='CLOUD_SPANNER',
   spanner_options = """{
      "table": "TABLE_NAME",
      "change_timestamp_column": "CHANGE_TIMESTAMP",
      "priority": "PRIORITY",
      "tag": "TAG",
   }"""
)

Ganti kode berikut:

  • PROJECT_ID: nama project Google Cloud Anda.
  • INSTANCE_ID: nama instance database Anda.
  • DATABASE_ID: nama database Anda.
  • TABLE_NAME: nama tabel tujuan yang ada.
  • CHANGE_TIMESTAMP: nama kolom jenis TIMESTAMP di tabel Spanner tujuan. Opsi ini digunakan selama ekspor untuk melacak stempel waktu pembaruan baris terbaru. Jika opsi ini ditentukan, ekspor akan terlebih dahulu membaca baris dalam tabel Spanner, untuk memastikan hanya update baris terbaru yang ditulis. Sebaiknya tentukan kolom jenis TIMESTAMP saat Anda menjalankan ekspor berkelanjutan, yang mengurutkan perubahan pada baris dengan kunci utama yang sama.
  • PRIORITY (opsional): prioritas permintaan penulisan. Nilai yang diizinkan: LOW, MEDIUM, HIGH. Nilai default: MEDIUM.
  • TAG (opsional): tag permintaan untuk membantu mengidentifikasi traffic pengekspor dalam pemantauan Spanner. Nilai default: bq_export.

Persyaratan kueri ekspor

Untuk mengekspor hasil kueri ke Spanner, hasilnya harus memenuhi persyaratan berikut:

  • Semua kolom dalam kumpulan hasil harus ada di tabel tujuan, dan jenisnya harus cocok atau dapat dikonversi.
  • Kumpulan hasil harus berisi semua kolom NOT NULL untuk tabel tujuan.
  • Nilai kolom tidak boleh melebihi batas ukuran data dalam tabel Spanner.
  • Jenis kolom apa pun yang tidak didukung harus dikonversi ke salah satu jenis yang didukung sebelum diekspor ke Spanner.

Konversi jenis

Agar mudah digunakan, pengekspor Spanner otomatis menerapkan konversi jenis berikut:

Jenis BigQuery Jenis spanner
BIGNUMERIC NUMERIC (khusus dialek PostgreSQL)
FLOAT64 FLOAT32
BYTES PROTO
INT64 ENUM

Ekspor data

Anda dapat menggunakan pernyataan EXPORT DATA untuk mengekspor data dari tabel BigQuery ke tabel Spanner.

Contoh berikut mengekspor kolom yang dipilih dari tabel bernama mydataset.table1:

EXPORT DATA OPTIONS (
  uri="https://spanner.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID",
  format='CLOUD_SPANNER',
  spanner_options="""{ "table": "TABLE_NAME" }"""
)
AS SELECT * FROM mydataset.table1;

Ganti kode berikut:

  • PROJECT_ID: nama project Google Cloud Anda
  • INSTANCE_ID: nama instance database Anda
  • DATABASE_ID: nama database Anda
  • TABLE_NAME: nama tabel tujuan yang ada

Ekspor beberapa hasil dengan nilai rowkey yang sama

Saat Anda mengekspor hasil yang berisi beberapa baris dengan nilai rowkey yang sama, nilai yang ditulis ke Spanner akan berada di baris Spanner yang sama. Hanya satu baris BigQuery yang cocok (tidak ada jaminan yang mana) yang akan ada di set baris Spanner yang dihasilkan oleh ekspor.

Mengekspor menggunakan Koneksi CLOUD_RESOURCE

Anda dapat mendelegasikan izin tulis ke koneksi BigQuery CLOUD_RESOURCE untuk menjalankan ekspor tanpa memberikan akses langsung kepada pengguna ke database Spanner.

Sebelum Anda mengekspor ke Spanner dengan koneksi CLOUD_RESOURCE, lakukan hal berikut:

Membuat koneksi

Anda dapat membuat atau menggunakan koneksi CLOUD_RESOURCE yang ada untuk terhubung ke Spanner.

Pilih salah satu opsi berikut:

Konsol

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Di panel kiri, klik Explorer:

    Tombol yang ditandai untuk panel Explorer.

    Jika Anda tidak melihat panel kiri, klik Luaskan panel kiri untuk membuka panel.

  3. Di panel Explorer, luaskan nama project Anda, lalu klik Connections.

  4. Di halaman Koneksi, klik Buat koneksi.

  5. Untuk Connection type, pilih Vertex AI remote models, remote functions, BigLake and Spanner (Cloud Resource).

  6. Di kolom Connection ID, masukkan nama untuk koneksi Anda.

  7. Untuk Location type, pilih lokasi untuk koneksi Anda. Koneksi harus ditempatkan bersama resource Anda yang lain seperti set data.

  8. Klik Create connection.

  9. Klik Go to connection.

  10. Di panel Connection info, salin ID akun layanan untuk digunakan pada langkah berikutnya.

bq

  1. Di lingkungan command line, buat koneksi:

    bq mk --connection --location=REGION --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE CONNECTION_ID

    Parameter --project_id akan mengganti project default.

    Ganti kode berikut:

    • REGION: region koneksi Anda
    • PROJECT_ID: Project ID Google Cloud Anda
    • CONNECTION_ID: ID untuk koneksi Anda

    Saat Anda membuat resource koneksi, BigQuery akan membuat akun layanan sistem unik dan mengaitkannya dengan koneksi.

    Pemecahan masalah: Jika Anda mendapatkan error koneksi berikut, update Google Cloud SDK:

    Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
    
  2. Ambil dan salin ID akun layanan untuk digunakan pada langkah berikutnya:

    bq show --connection PROJECT_ID.REGION.CONNECTION_ID

    Outputnya mirip dengan hal berikut ini:

    name                          properties
    1234.REGION.CONNECTION_ID     {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
    

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Python API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

import google.api_core.exceptions
from google.cloud import bigquery_connection_v1

client = bigquery_connection_v1.ConnectionServiceClient()


def create_connection(
    project_id: str,
    location: str,
    connection_id: str,
):
    """Creates a BigQuery connection to a Cloud Resource.

    Cloud Resource connection creates a service account which can then be
    granted access to other Google Cloud resources for federated queries.

    Args:
        project_id: The Google Cloud project ID.
        location: The location of the connection (for example, "us-central1").
        connection_id: The ID of the connection to create.
    """

    parent = client.common_location_path(project_id, location)

    connection = bigquery_connection_v1.Connection(
        friendly_name="Example Connection",
        description="A sample connection for a Cloud Resource.",
        cloud_resource=bigquery_connection_v1.CloudResourceProperties(),
    )

    try:
        created_connection = client.create_connection(
            parent=parent, connection_id=connection_id, connection=connection
        )
        print(f"Successfully created connection: {created_connection.name}")
        print(f"Friendly name: {created_connection.friendly_name}")
        print(
            f"Service Account: {created_connection.cloud_resource.service_account_id}"
        )

    except google.api_core.exceptions.AlreadyExists:
        print(f"Connection with ID '{connection_id}' already exists.")
        print("Please use a different connection ID.")
    except Exception as e:
        print(f"An unexpected error occurred while creating the connection: {e}")

Node.js

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Node.js di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Node.js API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

const {ConnectionServiceClient} =
  require('@google-cloud/bigquery-connection').v1;
const {status} = require('@grpc/grpc-js');

const client = new ConnectionServiceClient();

/**
 * Creates a new BigQuery connection to a Cloud Resource.
 *
 * A Cloud Resource connection creates a service account that can be granted access
 * to other Google Cloud resources.
 *
 * @param {string} projectId The Google Cloud project ID. for example, 'example-project-id'
 * @param {string} location The location of the project to create the connection in. for example, 'us-central1'
 * @param {string} connectionId The ID of the connection to create. for example, 'example-connection-id'
 */
async function createConnection(projectId, location, connectionId) {
  const parent = client.locationPath(projectId, location);

  const connection = {
    friendlyName: 'Example Connection',
    description: 'A sample connection for a Cloud Resource',
    // The service account for this cloudResource will be created by the API.
    // Its ID will be available in the response.
    cloudResource: {},
  };

  const request = {
    parent,
    connectionId,
    connection,
  };

  try {
    const [response] = await client.createConnection(request);

    console.log(`Successfully created connection: ${response.name}`);
    console.log(`Friendly name: ${response.friendlyName}`);

    console.log(`Service Account: ${response.cloudResource.serviceAccountId}`);
  } catch (err) {
    if (err.code === status.ALREADY_EXISTS) {
      console.log(`Connection '${connectionId}' already exists.`);
    } else {
      console.error(`Error creating connection: ${err.message}`);
    }
  }
}

Terraform

Gunakan resource google_bigquery_connection.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

Contoh berikut membuat koneksi resource Cloud bernama my_cloud_resource_connection di region US:


# This queries the provider for project information.
data "google_project" "default" {}

# This creates a cloud resource connection in the US region named my_cloud_resource_connection.
# Note: The cloud resource nested object has only one output field - serviceAccountId.
resource "google_bigquery_connection" "default" {
  connection_id = "my_cloud_resource_connection"
  project       = data.google_project.default.project_id
  location      = "US"
  cloud_resource {}
}

Untuk menerapkan konfigurasi Terraform di project, selesaikan langkah-langkah di bagian berikut. Google Cloud

Menyiapkan Cloud Shell

  1. Luncurkan Cloud Shell.
  2. Tetapkan project Google Cloud default tempat Anda ingin menerapkan konfigurasi Terraform.

    Anda hanya perlu menjalankan perintah ini sekali per project, dan dapat dijalankan di direktori mana pun.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Variabel lingkungan akan diganti jika Anda menetapkan nilai eksplisit dalam file konfigurasi Terraform.

Menyiapkan direktori

Setiap file konfigurasi Terraform harus memiliki direktorinya sendiri (juga disebut modul root).

  1. Di Cloud Shell, buat direktori dan file baru di dalam direktori tersebut. Nama file harus memiliki ekstensi .tf—misalnya main.tf. Dalam tutorial ini, file ini disebut sebagai main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Jika mengikuti tutorial, Anda dapat menyalin kode contoh di setiap bagian atau langkah.

    Salin kode contoh ke dalam main.tf yang baru dibuat.

    Atau, salin kode dari GitHub. Tindakan ini direkomendasikan jika cuplikan Terraform adalah bagian dari solusi menyeluruh.

  3. Tinjau dan ubah contoh parameter untuk diterapkan pada lingkungan Anda.
  4. Simpan perubahan Anda.
  5. Lakukan inisialisasi Terraform. Anda hanya perlu melakukan ini sekali per direktori.
    terraform init

    Secara opsional, untuk menggunakan versi penyedia Google terbaru, sertakan opsi -upgrade:

    terraform init -upgrade

Menerapkan perubahan

  1. Tinjau konfigurasi dan pastikan resource yang akan dibuat atau diupdate oleh Terraform sesuai yang Anda inginkan:
    terraform plan

    Koreksi konfigurasi jika diperlukan.

  2. Terapkan konfigurasi Terraform dengan menjalankan perintah berikut dan memasukkan yes pada prompt:
    terraform apply

    Tunggu hingga Terraform menampilkan pesan "Apply complete!".

  3. Buka Google Cloud project Anda untuk melihat hasilnya. Di konsol Google Cloud , buka resource Anda di UI untuk memastikan bahwa Terraform telah membuat atau mengupdatenya.

Setelah Anda membuat koneksi, buka koneksi tersebut. Di panel Connection info, salin ID akun layanan. Anda akan memerlukan ID ini saat mengonfigurasi izin untuk koneksi. Saat Anda membuat resource koneksi, BigQuery akan membuat akun layanan sistem unik dan mengaitkannya dengan koneksi.

Menyiapkan akses

Anda harus memberikan akses tulis ke akun layanan yang terkait dengan koneksi baru ke instance atau database Spanner. Sebaiknya gunakan peran IAM bawaan Cloud Spanner Database User (roles/spanner.databaseUser). Langkah-langkah ini memerlukan ID akun layanan yang Anda salin saat membuat koneksi.

Untuk memberikan akses ke peran tingkat database untuk akun layanan, lakukan hal berikut:

  1. Buka halaman instance Spanner.

    Buka halaman instance

  2. Klik nama instance yang berisi database Anda.

  3. Di tab Overview, centang kotak untuk database Anda.

  4. Dialog Info panel akan muncul. Klik Add principal.

  5. Untuk New principals, masukkan ID akun layanan yang Anda salin sebelumnya.

  6. Di kolom Pilih peran, pilih peran dengan izin spanner.databases.write. Sebaiknya gunakan peran Pengguna Database Cloud Spanner.

  7. Klik Simpan.

Jalankan ekspor menggunakan koneksi CLOUD_RESOURCE

Setelah koneksi dibuat dan akses yang sesuai diberikan, Anda dapat menjalankan ekspor menggunakan koneksi CLOUD_RESOURCE. Contoh berikut menunjukkan perintah EXPORT yang diekspor dengan koneksi CLOUD_RESOURCE.

EXPORT DATA WITH CONNECTION `PROJECT_ID.LOCATION.CONNECTION_NAME` OPTIONS (
  uri="https://spanner.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID",
  format='CLOUD_SPANNER',
  spanner_options="""{ "table": "SPANNER_TABLE_NAME" }"""
)
AS SELECT * FROM my_bq_dataset.table1;

Ganti kode berikut:

  • PROJECT_ID: nama project Google Cloud Anda.
  • LOCATION: lokasi tempat Anda membuat koneksi—misalnya, us.
  • CONNECTION_NAME: nama koneksi yang digunakan untuk menjalankan ekspor—misalnya, myconnection.
  • INSTANCE_ID: nama instance database Spanner Anda.
  • DATABASE_ID: nama database Spanner Anda.
  • SPANNER_TABLE_NAME: Nama tabel Spanner tujuan yang ada.

Mengekspor secara berkelanjutan

Untuk memproses kueri ekspor secara berkelanjutan, lihat Membuat kueri berkelanjutan untuk mengetahui petunjuk dan contoh kode.

Pengoptimalan ekspor

Untuk mengoptimalkan ekspor data dari BigQuery ke Spanner, Anda dapat mencoba hal berikut:

  • Tingkatkan jumlah node di instance tujuan Spanner. Selama tahap awal pengeksporan, meningkatkan jumlah node dalam instance mungkin tidak langsung meningkatkan throughput ekspor. Penundaan kecil dapat terjadi saat Spanner melakukan pemisahan berbasis beban. Dengan pemisahan berbasis beban, throughput ekspor akan meningkat dan stabil. Menggunakan batch data pernyataan EXPORT DATA untuk mengoptimalkan penulisan ke Spanner. Untuk mengetahui informasi selengkapnya, lihat Ringkasan performa.

  • Tentukan prioritas HIGH dalam spanner_options. Jika instance Spanner Anda mengaktifkan penskalaan otomatis, menetapkan prioritas HIGH akan membantu memastikan pemanfaatan CPU mencapai nilai minimum yang diperlukan untuk memicu penskalaan. Hal ini memungkinkan penskala otomatis menambahkan resource komputasi sebagai respons terhadap beban ekspor, yang dapat meningkatkan throughput ekspor secara keseluruhan.

    Contoh berikut menunjukkan perintah ekspor Spanner yang ditetapkan ke prioritas HIGH:

    EXPORT DATA OPTIONS (
      uri="https://spanner.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID",
      format='CLOUD_SPANNER',
      spanner_options="""{ "table": "TABLE_NAME", "priority": "HIGH" }"""
    )
  • Hindari pengurutan hasil kueri. Jika set hasil berisi semua kolom kunci utama, pengekspor akan otomatis mengurutkan kunci utama tabel tujuan untuk menyederhanakan penulisan dan meminimalkan pertentangan.

    Jika kunci utama tabel tujuan mencakup kolom yang dibuat, tambahkan ekspresi kolom yang dibuat ke kueri untuk memastikan data yang diekspor diurutkan dan dikelompokkan dengan benar.

    Misalnya, dalam skema Spanner berikut, SaleYear dan SaleMonth adalah kolom yang dihasilkan yang membentuk awal kunci primer Spanner:

    CREATE TABLE Sales (
      SaleId STRING(36) NOT NULL,
      ProductId INT64 NOT NULL,
      SaleTimestamp TIMESTAMP NOT NULL,
      Amount FLOAT64,
      -- Generated columns
      SaleYear INT64 AS (EXTRACT(YEAR FROM SaleTimestamp)) STORED,
      SaleMonth INT64 AS (EXTRACT(MONTH FROM SaleTimestamp)) STORED,
    ) PRIMARY KEY (SaleYear, SaleMonth, SaleId);

    Saat Anda mengekspor data dari BigQuery ke tabel Spanner dengan kolom yang dihasilkan yang digunakan dalam kunci utama, sebaiknya, tetapi tidak wajib, untuk menyertakan ekspresi untuk kolom yang dihasilkan ini dalam kueri EXPORT DATA Anda. Hal ini memungkinkan BigQuery mengurutkan data dengan benar sebelumnya, yang sangat penting untuk pengelompokan dan penulisan yang efisien ke Spanner. Nilai untuk kolom yang dihasilkan dalam pernyataan EXPORT DATA tidak di-commit di Spanner, karena nilai tersebut dibuat secara otomatis oleh Spanner, tetapi digunakan untuk mengoptimalkan ekspor.

    Contoh berikut mengekspor data ke tabel Sales Spanner yang kunci utamanya menggunakan kolom yang dihasilkan. Untuk mengoptimalkan performa penulisan, kueri menyertakan ekspresi EXTRACT yang cocok dengan kolom SaleYear dan SaleMonth yang dihasilkan, sehingga BigQuery dapat mengurutkan data terlebih dahulu sebelum diekspor:

    EXPORT DATA OPTIONS (
      uri="https://spanner.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID",
      format='CLOUD_SPANNER',
      spanner_options="""{ "table": "Sales" }"""
    )
    AS SELECT
      s.SaleId,
      s.ProductId,
      s.SaleTimestamp,
      s.Amount,
      -- Add expressions that match the generated columns in the Spanner PK
      EXTRACT(YEAR FROM s.SaleTimestamp) AS SaleYear,
      EXTRACT(MONTH FROM s.SaleTimestamp) AS SaleMonth
    FROM my_dataset.sales_export AS s;
  • Untuk mencegah tugas yang berjalan lama, ekspor data menurut partisi. Memecah data BigQuery menggunakan kunci partisi, seperti stempel waktu dalam kueri Anda:

    EXPORT DATA OPTIONS (
      uri="https://spanner.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID",
      format='CLOUD_SPANNER',
      spanner_options="""{ "table": "TABLE_NAME", "priority": "MEDIUM" }"""
    )
    AS SELECT *
    FROM 'mydataset.table1' d
    WHERE
    d.timestamp >= TIMESTAMP '2025-08-28T00:00:00Z' AND
    d.timestamp < TIMESTAMP '2025-08-29T00:00:00Z';

    Hal ini memungkinkan kueri selesai dalam runtime tugas 6 jam. Untuk mengetahui informasi selengkapnya tentang batas ini, lihat batas tugas kueri.

  • Untuk meningkatkan performa pemuatan data, hapus indeks di tabel Spanner tempat data diimpor. Kemudian, buat ulang setelah impor selesai.

  • Sebaiknya mulai dengan satu node Spanner (1.000 unit pemrosesan) dan reservasi slot BigQuery minimal. Misalnya, 100 slot, atau 0 slot dasar pengukuran dengan penskalaan otomatis. Untuk ekspor di bawah 100 GB, konfigurasi ini biasanya selesai dalam batas tugas 6 jam. Untuk ekspor yang lebih besar dari 100 GB, tingkatkan throughput dengan menskalakan node Spanner dan reservasi slot BigQuery sesuai kebutuhan. Throughput diskalakan sekitar 5 MiB/dtk per node.

Harga

Saat Anda mengekspor data ke Spanner menggunakan pernyataan EXPORT DATA, Anda akan ditagih menggunakan harga komputasi kapasitas BigQuery.

Untuk mengekspor secara berkelanjutan ke Spanner menggunakan kueri berkelanjutan, Anda harus memiliki reservasi slot edisi BigQuery Enterprise atau Enterprise Plus dan penetapan reservasi yang menggunakan jenis tugas CONTINUOUS.

Ekspor BigQuery ke Spanner yang melintasi batas regional dikenai biaya menggunakan tarif ekstraksi data. Untuk informasi lebih lanjut, lihat Harga BigQuery. Untuk menghindari biaya transfer data, pastikan ekspor BigQuery Anda berjalan di region yang sama dengan pemimpin default Spanner.

Setelah data diekspor, Anda dikenai biaya penyimpanan data di Spanner. Untuk mengetahui informasi selengkapnya, lihat Harga Spanner.