クロスクラウド オペレーションでデータを読み込む

BigQuery 管理者またはアナリストは、Amazon Simple Storage Service(Amazon S3)バケットまたは Azure Blob Storage から BigQuery テーブルの中にデータを読み込むことができます。転送されたデータを、Google Cloud リージョンに存在するデータと結合できます。また BigQuery ML などの BigQuery 機能を利用することもできます。

次の方法でデータを BigQuery に転送できます。

割り当てと上限

割り当てと上限の詳細については、クエリジョブの割り当てと上限をご覧ください。

料金

LOAD ステートメントを使用してクラウド間で転送されたバイト数に対して課金されます。料金については、BigQuery Omni の料金の「Omni クロスクラウド データ転送」をご覧ください。

CREATE TABLE AS SELECT ステートメントまたは INSERT INTO SELECT ステートメントを使用してクラウド間で転送されたバイト数と、コンピューティング容量に対して課金されます。

LOAD ステートメントと CREATE TABLE AS SELECT ステートメントの両方では、Amazon S3 ファイルと Blob Storage ファイルをスキャンして読み込む目的で BigQuery Omni リージョン内のスロットが必要です。詳しくは、BigQuery Omni の料金をご覧ください。

始める前に

他のクラウドにあるファイルへの読み取りアクセス権を Google Cloud に与えるには、接続を作成して自分と共有するよう管理者に依頼してください。接続を作成する方法については、Amazon S3 に接続するまたは Blob Storage をご覧ください。

必要なロール

クロスクラウド転送を使ったデータ読み込みに必要な権限を取得するには、データセットに対する BigQuery データ編集者roles/bigquery.dataEditor)IAM ロールの付与を管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

この事前定義ロールには、クロスクラウド転送を使用したデータ読み込みに必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

クロスクラウド転送を使用してデータを読み込むには、次の権限が必要です。

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

これらの権限は、カスタムロールや他の事前定義ロールを使用して取得することもできます。

BigQuery での IAM ロールの詳細については、事前定義ロールと権限をご覧ください。

データの読み込み

BigQuery にデータを読み込むには、LOAD DATA [INTO|OVERWRITE] ステートメントを使用できます。

制限事項

  • LOAD DATA ジョブは予約では実行されません。ジョブは、Google Cloud が管理するオンデマンド スロットを利用します。
  • 接続と宛先データセットは、同じプロジェクトに属している必要があります。プロジェクトをまたぐデータの読み込みは、サポートされていません。
  • LOAD DATA は、Amazon Simple Storage Service(Amazon S3)または Azure Blob Storage から同じロケーションの BigQuery リージョンにデータを転送する場合にのみサポートされます。詳細については、ロケーションをご覧ください。
    • 任意の US リージョンから US マルチリージョンにデータを転送できます。任意の EU リージョンから EU マルチリージョンに転送することもできます。

例 1

次の例では、自動検出スキーマを使用して、sample.parquet という名前の Parquet ファイルを Amazon S3 バケットから test_parquet テーブルに読み込みます。

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

例 2

次の例では、接頭辞 sampled* を持つ CSV ファイルを Blob Storage から test_csv テーブルに読み込み、事前定義された列が時間でパーティショニングされます。

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`

例 3

次の例では、自動検出スキーマを使用して、sample.parquet という名前のファイルのデータによって既存のテーブル test_parquet を上書きします。

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

データをフィルタする

CREATE TABLE AS SELECT ステートメントINSERT INTO SELECT ステートメントを使用すると、BigQuery への転送前にデータをフィルタできます。

制限事項

  • SELECT クエリの結果が論理バイトで 60 GiB を超えると、クエリは失敗します。テーブルは作成されず、データは転送されません。スキャンされるデータのサイズを小さくする方法については、クエリで処理されるデータを削減するをご覧ください。

  • 一時テーブルはサポートされていません。

  • Well-known binary(WKB)の地理空間データ形式の転送はサポートされていません。

  • INSERT INTO SELECT ステートメントは、クラスタ化テーブルへのデータ転送をサポートしていません。

  • INSERT INTO SELECT ステートメントでは、宛先テーブルが SELECT クエリのソーステーブルと同じ場合、INSERT INTO SELECT ステートメントは宛先テーブル内のどの行も変更しません。BigQuery はリージョン間でデータを読み取ることができないので、宛先テーブルは変更されません。

  • CREATE TABLE AS SELECTINSERT INTO SELECT は、Amazon S3 または Blob Storage から同じロケーションの BigQuery リージョンにデータを転送する場合にのみサポートされます。詳細については、ロケーションをご覧ください。

    • 任意の US リージョンから US マルチリージョンにデータを転送できます。任意の EU リージョンから EU マルチリージョンに転送することもできます。

例 1

Amazon S3 からデータを参照する myawsdataset.orders という名前の BigLake テーブルがあるとします。そのテーブルから、米国マルチリージョンの BigQuery テーブル myotherdataset.shipments にデータを転送する必要があります。

まず、myawsdataset.orders テーブルに関する情報を表示します。

    bq show myawsdataset.orders;

出力は次のようになります。

  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

次に、myotherdataset.shipments テーブルに関する情報を表示します。

  bq show myotherdataset.shipments

出力は次のようになります。出力を簡素化するために、一部の列は省略されています。

  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

ここで、CREATE TABLE AS SELECT ステートメントを使用して、米国のマルチリージョンにある myotherdataset.orders テーブルにデータを選択的に読み込めます。

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;

その後、新しく作成されたテーブルとの結合オペレーションを実行できます。

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.

新しいデータが利用可能になったら、INSERT INTO SELECT ステートメントを使用して、1993 年のデータを宛先テーブルに追加します。

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

例 2

次の例では、取り込み時間パーティション分割テーブルにデータを挿入します。

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

パーティション分割テーブルを作成した後、取り込み時間パーティション分割テーブルにデータを挿入できます。

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

ベスト プラクティス

  • 5 MB 未満の複数のファイルを読み込むことは避けてください。代わりに、ファイル用の外部テーブルを作成し、クエリ結果を Amazon S3 または Blob Storage にエクスポートしてより大きなファイルを作成します。この方法は、データの転送時間を改善するのに役立ちます。
  • 最大クエリ結果の上限については、BigQuery Omni の最大クエリ結果サイズをご覧ください。
  • ソースデータが gzip 圧縮ファイル内にある場合は、外部テーブルを作成するときに external_table_options.compression オプションを GZIP に設定します。

次のステップ