クエリ結果を Amazon S3 にエクスポートする

このドキュメントでは、BigLake テーブルに対して実行されたクエリの結果を Amazon Simple Storage Service(Amazon S3)バケットにエクスポートする方法について説明します。

BigQuery と Amazon S3 間のデータフローについては、データをエクスポートする際のデータフローをご覧ください。

制限事項

Amazon S3 と Blob Storage に基づく BigLake テーブルに適用される制限事項の全リストについては、制限事項をご覧ください。

始める前に

以下のリソースがあることを確認してください。

クエリ結果をエクスポートする

BigQuery Omni は、既存のコンテンツが存在するかどうかに関係なく、指定された Amazon S3 のロケーションにコンテンツを書き込みます。エクスポート クエリでは、既存のデータを上書きすることも、クエリ結果を既存のデータと混在させることもできます。クエリ結果は、空の Amazon S3 バケットにエクスポートすることをおすすめします。

クエリを実行するには、次のいずれかのオプションを選択します。

SQL

[クエリエディタ] フィールドに、GoogleSQL エクスポート クエリを入力します。GoogleSQL は Google Cloud コンソールのデフォルトの構文です。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    BigQuery に移動

  2. クエリエディタで次のステートメントを入力します。

       EXPORT DATA WITH CONNECTION `CONNECTION_REGION.CONNECTION_NAME`
       OPTIONS(uri="s3://BUCKET_NAME/PATH", format="FORMAT", ...)
       AS QUERY

    以下を置き換えます。

    • CONNECTION_REGION: 接続が作成されたリージョン。
    • CONNECTION_NAME: Amazon S3 バケットへの書き込みに必要な権限を使用して作成した接続名。
    • BUCKET_NAME: データを書き込む Amazon S3 バケット。
    • PATH: エクスポートされるファイルを書き込むパス。../aa/*../aa/b*c../aa/*bc../aa/bc* のように、パス文字列のリーフ ディレクトリに必ず 1 つのワイルドカード * を含める必要があります。BigQuery は、エクスポートされたファイルの数に応じて *0000..N に置き換えます。ファイルの数とサイズは BigQuery によって決まります。BigQuery が 2 つのファイルをエクスポートする場合、最初のファイルのファイル名に存在する *000000000000 に置き換えられ、2 番目のファイルのファイル名に存在する *000000000001 に置き換えられます。
    • FORMAT: サポートされている形式は JSONAVROCSVPARQUET です。
    • QUERY: BigLake テーブルに保存されているデータを分析するクエリ。

    • [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

Java

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.TableResult;

// Sample to export query results to Amazon S3 bucket
public class ExportQueryResultsToS3 {

  public static void main(String[] args) throws InterruptedException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String datasetName = "MY_DATASET_NAME";
    String externalTableName = "MY_EXTERNAL_TABLE_NAME";
    // connectionName should be in the format of connection_region.connection_name. e.g.
    // aws-us-east-1.s3-write-conn
    String connectionName = "MY_CONNECTION_REGION.MY_CONNECTION_NAME";
    // destinationUri must contain exactly one * anywhere in the leaf directory of the path string
    // e.g. ../aa/*, ../aa/b*c, ../aa/*bc, and ../aa/bc*
    // BigQuery replaces * with 0000..N depending on the number of files exported.
    // BigQuery determines the file count and sizes.
    String destinationUri = "s3://your-bucket-name/*";
    String format = "EXPORT_FORMAT";
    // Export result of query to find states starting with 'W'
    String query =
        String.format(
            "EXPORT DATA WITH CONNECTION `%s` OPTIONS(uri='%s', format='%s') "
              + "AS SELECT * FROM %s.%s.%s WHERE name LIKE 'W%%'",
            connectionName, destinationUri, format, projectId, datasetName, externalTableName);
    exportQueryResultsToS3(query);
  }

  public static void exportQueryResultsToS3(String query) throws InterruptedException {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableResult results = bigquery.query(QueryJobConfiguration.of(query));

      results
          .iterateAll()
          .forEach(row -> row.forEach(val -> System.out.printf("%s,", val.toString())));

      System.out.println("Query results exported to Amazon S3 successfully.");
    } catch (BigQueryException e) {
      System.out.println("Query not performed \n" + e.toString());
    }
  }
}

トラブルシューティング

quota failure に関連するエラーが発生した場合は、クエリ用の予約済み容量があるかどうかを確認します。スロット予約の詳細については、このドキュメントの始める前にをご覧ください。

次のステップ