Memuat data dengan operasi lintas-cloud

Sebagai administrator atau analis BigQuery, Anda dapat memuat data dari bucket Amazon Simple Storage Service (Amazon S3) atau Azure Blob Storage ke tabel BigQuery. Anda dapat menggabungkan data yang ditransfer dengan data yang ada di region Google Cloud atau memanfaatkan fitur BigQuery seperti BigQuery ML.

Anda dapat mentransfer data ke BigQuery dengan cara berikut:

Kuota dan batas

Untuk mengetahui informasi tentang kuota dan batas, lihat kuota dan batas tugas kueri.

Harga

Anda akan dikenai biaya untuk byte yang ditransfer di berbagai cloud menggunakan pernyataan LOAD. Untuk mengetahui informasi harga, lihat bagian Omni Cross Cloud Data Transfer di harga BigQuery Omni.

Anda akan dikenai biaya untuk byte yang ditransfer di seluruh cloud menggunakan pernyataan CREATE TABLE AS SELECT atau pernyataan INSERT INTO SELECT dan untuk kapasitas komputasi.

Pernyataan LOAD dan CREATE TABLE AS SELECT memerlukan slot di region BigQuery Omni guna memindai file Amazon S3 dan Blob Storage untuk memuatnya. Untuk informasi selengkapnya, lihat harga BigQuery Omni.

Sebelum memulai

Untuk memberi Google Cloud akses baca ke file di cloud lain, minta administrator Anda untuk membuat koneksi dan membagikannya kepada Anda. Untuk mengetahui informasi tentang cara membuat koneksi, lihat Menghubungkan ke Amazon S3 atau Blob Storage.

Peran yang diperlukan

Untuk mendapatkan izin yang diperlukan guna memuat data menggunakan transfer lintas-cloud, minta administrator untuk memberi Anda peran IAM BigQuery Data Editor (roles/bigquery.dataEditor) pada set data. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses.

Peran yang telah ditentukan ini berisi izin yang diperlukan untuk memuat data menggunakan transfer lintas cloud. Untuk melihat izin yang benar-benar diperlukan, luaskan bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk memuat data menggunakan transfer lintas-cloud:

  • bigquery.tables.create
  • bigquery.tables.get
  • bigquery.tables.updateData
  • bigquery.tables.update
  • bigquery.jobs.create
  • bigquery.connections.use

Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran yang telah ditetapkan lainnya.

Untuk mengetahui informasi selengkapnya tentang peran IAM di BigQuery, lihat Peran dan izin yang telah ditentukan sebelumnya.

Memuat Data

Anda dapat memuat data ke BigQuery dengan pernyataan LOAD DATA [INTO|OVERWRITE].

Batasan

  • Pemuatan data ke tabel tujuan dengan partisi waktu penyerapan tidak didukung.
  • LOAD DATA tugas tidak berjalan pada pemesanan. Tugas menggunakan slot sesuai permintaan yang dikelola oleh Google Cloud.
  • Koneksi dan set data tujuan harus termasuk dalam project yang sama. Pemuatan data di seluruh project tidak didukung.
  • LOAD DATA hanya didukung saat Anda mentransfer data dari Amazon Simple Storage Service (Amazon S3) atau Azure Blob Storage ke region BigQuery yang ditempatkan bersama. Untuk mengetahui informasi selengkapnya, lihat Lokasi.
    • Anda dapat mentransfer data dari region US mana pun ke multi-region US. Anda juga dapat mentransfer dari region EU mana pun ke multi-region EU.

Contoh

Contoh 1

Contoh berikut memuat file parquet bernama sample.parquet dari bucket Amazon S3 ke dalam tabel test_parquet dengan skema deteksi otomatis:

LOAD DATA INTO mydataset.testparquet
  FROM FILES (
    uris = ['s3://test-bucket/sample.parquet'],
    format = 'PARQUET'
  )
  WITH CONNECTION `aws-us-east-1.test-connection`

Contoh 2

Contoh berikut memuat file CSV dengan awalan sampled* dari Blob Storage ke tabel test_csv dengan partisi kolom yang telah ditentukan berdasarkan waktu:

LOAD DATA INTO mydataset.test_csv (Number INT64, Name STRING, Time DATE)
  PARTITION BY Time
  FROM FILES (
    format = 'CSV', uris = ['azure://test.blob.core.windows.net/container/sampled*'],
    skip_leading_rows=1
  )
  WITH CONNECTION `azure-eastus2.test-connection`

Contoh 3

Contoh berikut menimpa tabel test_parquet yang ada dengan data dari file bernama sample.parquet dengan skema deteksi otomatis:

LOAD DATA OVERWRITE mydataset.testparquet
  FROM FILES (
    uris = ['s3://test-bucket/sample.parquet'],
    format = 'PARQUET'
  )
  WITH CONNECTION `aws-us-east-1.test-connection`

Data filter

Anda dapat memfilter data sebelum mentransfernya ke BigQuery menggunakan pernyataan CREATE TABLE AS SELECT dan pernyataan INSERT INTO SELECT.

Batasan

  • Jika hasil kueri SELECT melebihi 20 GiB dalam byte logis, maka kueri akan gagal. Tabel tidak dibuat dan data tidak ditransfer. Untuk mempelajari cara mengurangi ukuran data yang dipindai, lihat Mengurangi data yang diproses dalam kueri.

  • Tabel sementara tidak didukung.

  • Mentransfer format data geospasial Well-known binary (WKB) tidak didukung.

  • Pernyataan INSERT INTO SELECT tidak mendukung pentransferan data ke tabel yang dikelompokkan.

  • Dalam pernyataan INSERT INTO SELECT, jika tabel tujuan sama dengan tabel sumber dalam kueri SELECT, maka pernyataan INSERT INTO SELECT tidak akan mengubah baris apa pun di tabel tujuan. Tabel tujuan tidak diubah karena BigQuery tidak dapat membaca data lintas region.

  • CREATE TABLE AS SELECT dan INSERT INTO SELECT hanya didukung saat Anda mentransfer data dari Amazon S3 atau Blob Storage ke region BigQuery yang ditempatkan bersama. Untuk mengetahui informasi selengkapnya, lihat Lokasi.

    • Anda dapat mentransfer data dari region US mana pun ke multi-region US. Anda juga dapat mentransfer dari region EU mana pun ke multi-region EU.

Contoh

Contoh 1

Misalkan Anda memiliki tabel BigLake bernama myawsdataset.orders yang mereferensikan data dari Amazon S3. Anda ingin mentransfer data dari tabel tersebut ke tabel BigQuery myotherdataset.shipments di multi-region AS.

Pertama, tampilkan informasi tentang tabel myawsdataset.orders:

    bq show myawsdataset.orders;

Outputnya mirip dengan hal berikut ini:

  Last modified             Schema              Type     Total URIs   Expiration
----------------- -------------------------- ---------- ------------ -----------
  31 Oct 17:40:28   |- l_orderkey: integer     EXTERNAL   1
                    |- l_partkey: integer
                    |- l_suppkey: integer
                    |- l_linenumber: integer
                    |- l_returnflag: string
                    |- l_linestatus: string
                    |- l_commitdate: date

Selanjutnya, tampilkan informasi tentang tabel myotherdataset.shipments:

  bq show myotherdataset.shipments

Outputnya mirip dengan yang berikut ini. Beberapa kolom dihilangkan untuk menyederhanakan output.

  Last modified             Schema             Total Rows   Total Bytes   Expiration   Time Partitioning   Clustered Fields   Total Logical
 ----------------- --------------------------- ------------ ------------- ------------ ------------------- ------------------ ---------------
  31 Oct 17:34:31   |- l_orderkey: integer      3086653      210767042                                                         210767042
                    |- l_partkey: integer
                    |- l_suppkey: integer
                    |- l_commitdate: date
                    |- l_shipdate: date
                    |- l_receiptdate: date
                    |- l_shipinstruct: string
                    |- l_shipmode: string

Sekarang, dengan pernyataan CREATE TABLE AS SELECT, Anda dapat memuat data secara selektif ke tabel myotherdataset.orders di multi-region AS:

CREATE OR REPLACE TABLE
  myotherdataset.orders
  PARTITION BY DATE_TRUNC(l_commitdate, YEAR) AS
SELECT
  *
FROM
  myawsdataset.orders
WHERE
  EXTRACT(YEAR FROM l_commitdate) = 1992;

Anda kemudian dapat melakukan operasi gabungan dengan tabel yang baru dibuat:

SELECT
  orders.l_orderkey,
  orders.l_orderkey,
  orders.l_suppkey,
  orders.l_commitdate,
  orders.l_returnflag,
  shipments.l_shipmode,
  shipments.l_shipinstruct
FROM
  myotherdataset.shipments
JOIN
  `myotherdataset.orders` as orders
ON
  orders.l_orderkey = shipments.l_orderkey
AND orders.l_partkey = shipments.l_partkey
AND orders.l_suppkey = shipments.l_suppkey
WHERE orders.l_returnflag = 'R'; -- 'R' means refunded.

Jika data baru tersedia, tambahkan data tahun 1993 ke tabel tujuan menggunakan pernyataan INSERT INTO SELECT:

INSERT INTO
   myotherdataset.orders
 SELECT
   *
 FROM
   myawsdataset.orders
 WHERE
   EXTRACT(YEAR FROM l_commitdate) = 1993;

Contoh 2

Contoh berikut menyisipkan data ke dalam tabel berpartisi berdasarkan waktu penyerapan:

CREATE TABLE
 mydataset.orders(id String, numeric_id INT)
PARTITION BY _PARTITIONDATE;

Setelah membuat tabel berpartisi, Anda dapat memasukkan data ke tabel berpartisi berdasarkan waktu penyerapan:

INSERT INTO
 mydataset.orders(
   _PARTITIONTIME,
   id,
   numeric_id)
SELECT
 TIMESTAMP("2023-01-01"),
 id,
 numeric_id,
FROM
 mydataset.ordersof23
WHERE
 numeric_id > 4000000;

Praktik terbaik

  • Hindari memuat beberapa file yang berukuran kurang dari 5  MB. Sebagai gantinya, buat tabel eksternal untuk file Anda dan ekspor hasil kueri ke Amazon S3 atau Blob Storage untuk membuat file yang lebih besar. Metode ini membantu meningkatkan waktu transfer data Anda.
  • Untuk mengetahui informasi tentang batas hasil kueri maksimum, lihat Ukuran hasil kueri maksimum BigQuery Omni.
  • Jika data sumber Anda berada dalam file yang dikompresi gzip, maka saat membuat tabel eksternal, tetapkan opsi external_table_options.compression ke GZIP.

Langkah selanjutnya