Amazon S3 データにクエリを実行する

このドキュメントでは、Amazon Simple Storage Service(Amazon S3)BigLake テーブルに保存されているデータに対してクエリを行う方法について説明します。

始める前に

Amazon S3 BigLake テーブルがあることを確認します。

必要なロール

Amazon S3 BigLake テーブルにクエリを実行するには、BigQuery API の呼び出し元に次のロールがあることを確認してください。

  • BigQuery Connection ユーザー(roles/bigquery.connectionUser
  • BigQuery データ閲覧者(roles/bigquery.dataViewer
  • BigQuery ユーザー(roles/bigquery.user

呼び出し元は、自身のアカウントまたは Amazon S3 接続サービス アカウントのいずれかにできます。権限に応じて、これらのロールを自身に付与するか、これらのロールを付与するよう管理者に依頼します。ロールの付与の詳細については、リソースに対して付与可能なロールの表示をご覧ください。

Amazon S3 BigLake テーブルに対してクエリを行うのに必要である正確な権限については、[必要な権限] セクションを開いてご確認ください。

必要な権限

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

Amazon S3 BigLake テーブルに対してクエリを行う

Amazon S3 BigLake テーブルを作成すると、それが標準の BigQuery テーブルの場合と同じように、GoogleSQL 構文を使用してクエリを実行できます。

キャッシュに保存されたクエリ結果は、BigQuery の一時テーブルに保存されます。一時 BigLake テーブルに対してクエリを実行するには、一時テーブルに対して BigLake クエリを実行するをご覧ください。BigQuery Omni の制限事項と割り当ての詳細については、制限事項割り当てをご覧ください。

BigQuery Omni リージョンで予約を作成する場合は、Enterprise エディションを使用します。このエディションを使用して予約を作成する方法については、予約を作成するをご覧ください。

BigLake Amazon S3 テーブルに対してクエリを行います。

SQL

テーブルを検索するには:

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

    [BigQuery] に移動

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

    SELECT * FROM DATASET_NAME.TABLE_NAME;

    次のように置き換えます。

    • DATASET_NAME: 作成したデータセットの名前
    • TABLE_NAME: 作成したテーブルの名前

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

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

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.CsvOptions;
import com.google.cloud.bigquery.DatasetId;
import com.google.cloud.bigquery.ExternalTableDefinition;
import com.google.cloud.bigquery.Field;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.Schema;
import com.google.cloud.bigquery.StandardSQLTypeName;
import com.google.cloud.bigquery.TableId;
import com.google.cloud.bigquery.TableInfo;
import com.google.cloud.bigquery.TableResult;

// Sample to queries an external data source aws s3 using a permanent table
public class QueryExternalTableAws {

  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";
    // Query to find states starting with 'W'
    String query =
        String.format(
            "SELECT * FROM s%.%s.%s WHERE name LIKE 'W%%'",
            projectId, datasetName, externalTableName);
    queryExternalTableAws(query);
  }

  public static void queryExternalTableAws(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 on aws external permanent table performed successfully.");
    } catch (BigQueryException e) {
      System.out.println("Query not performed \n" + e.toString());
    }
  }
}

一時テーブルに対してクエリを実行する

BigQuery は、クエリ結果を格納する一時テーブルを作成します。一時テーブルからクエリ結果を取得するには、Google Cloud コンソールまたは BigQuery API を使用します。

次のオプションのいずれかを選択します。

コンソール

外部のクラウドデータを参照する BigLake テーブルに対してクエリを実行すると、Google Cloud コンソールでクエリ結果を確認できます。

API

API を使用して BigLake テーブルに対してクエリを実行するには:

  1. Job オブジェクトを作成します。
  2. クエリを非同期で実行するには jobs.insert メソッドを呼び出し、同期的にクエリを実行するには jobs.query メソッドを呼び出して、Job オブジェクトを渡します。
  3. 指定されたジョブ参照を渡して jobs.getQueryResults の行を読み取り、クエリ結果の指定されたテーブル参照を渡して tabledata.list メソッドを読み取ります。

_FILE_NAME 疑似列をクエリする

外部データソースに基づくテーブルは、_FILE_NAME という名前の疑似列を提供します。この列には、行が属するファイルへの完全修飾パスが含まれます。この列は、Cloud StorageGoogle ドライブAmazon S3Azure Blob Storage に保存されている外部データを参照するテーブルでのみ使用できます。

_FILE_NAME という列名は予約されています。つまり、この名前を持つ列はどのテーブルにも作成できません。_FILE_NAME の値を選択するには、エイリアスを使用する必要があります。次の例のクエリでは、エイリアス fn を疑似列に割り当て、_FILE_NAME を選択しています。

  bq query \
  --project_id=PROJECT_ID \
  --use_legacy_sql=false \
  'SELECT
     name,
     _FILE_NAME AS fn
   FROM
     `DATASET.TABLE_NAME`
   WHERE
     name contains "Alex"' 

次のように置き換えます。

  • PROJECT_ID は、有効なプロジェクト ID です。Cloud Shell を使用する場合や Google Cloud CLI でデフォルトのプロジェクトを設定する場合、このフラグは不要です。
  • DATASET は、外部の永続テーブルが保存されているデータセットの名前です。
  • TABLE_NAME は、外部の永続テーブルの名前です。

クエリに _FILE_NAME 疑似列に対するフィルタ述語がある場合、BigQuery は、フィルタに一致しないファイルの読み取りをスキップしようとします。_FILE_NAME 疑似列を使用してクエリ述語を作成する場合、疑似列を使用して取り込み時間パーティション分割テーブルに対するクエリを実行する場合と同様の推奨事項が適用されます。

次のステップ