クロスクラウド オペレーションでデータを読み込む
BigQuery 管理者またはアナリストとして、Amazon Simple Storage Service(Amazon S3)バケットまたは Azure Blob Storage から BigQuery テーブルにデータを読み込むことができます。転送されたデータを、Google Cloud リージョンに存在するデータと結合できます。また BigQuery ML などの BigQuery 機能を利用することもできます。
次の方法でデータを BigQuery に転送できます。
Amazon S3 と Azure Blob Storage のファイルから BigQuery テーブルにデータを転送するには、
LOAD DATA
ステートメントを使用します。CREATE TABLE AS SELECT
ステートメントを使用して、Amazon S3 または Blob Storage のファイルのデータをフィルタした後で、結果を BigQuery テーブルに転送します。宛先テーブルにデータを追加するには、INSERT INTO SELECT
ステートメントを使用します。データ操作は、Amazon S3 または Blob Storage からデータを参照する外部テーブルに適用されます。
割り当てと上限
割り当てと上限の詳細については、クエリジョブの割り当てと上限をご覧ください。
料金
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
次の例では、既存のテーブル test_parquet
を、自動検出スキーマを使用して sample.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 SELECT
とINSERT 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
に設定します。
次のステップ
- BigQuery ML について学習する。
- BigQuery Omni について確認する。
- クエリの実行方法を学習する。
- BigQuery Omni の VPC Service Controls の設定方法を確認する。
- Amazon S3 から BigQuery 、およびBlob Storage から BigQuery への定期的な読み込みジョブをスケジュールして管理する方法を確認する。