外部でパーティションに分割されたデータを使用する
BigQuery 外部テーブルを使用すると、次のデータストアにあるパーティションに分割されたデータをクエリできます。
外部のパーティション分割データは、デフォルトの Hive パーティショニング レイアウトを使用し、次のいずれかの形式にする必要があります。
- Avro
- CSV
- JSON
- ORC
- Parquet
外部でパーティションに分割されたデータに対してクエリを行うには、BigLake テーブルまたは外部テーブルを作成する必要があります。テーブルレベルできめ細かいセキュリティを適用できるため、BigLake テーブルの使用をおすすめします。BigLake テーブルと外部テーブルの詳細については、BigLake テーブルの概要と外部テーブルの概要をご覧ください。
Hive パーティショニングのサポートは、テーブル定義ファイルで適切なオプションを設定することにより有効化されます。マネージド パーティション分割テーブルでのクエリの手順については、パーティション分割テーブルの概要をご覧ください。
パーティション スキーマ
以降のセクションでは、BigQuery がサポートするデフォルトの Hive パーティション分割レイアウトとスキーマ検出モードについて説明します。
不要なファイルの読み取りを回避し、パフォーマンスを向上させるには、クエリでパーティション キーの述語フィルタを使用します。
サポートされるデータ レイアウト
Cloud Storage からデータをクエリする場合、Hive パーティション キーは通常の列として表示されます。データはデフォルトの Hive パーティション分割レイアウトに従う必要があります。たとえば、次のファイルはデフォルトのレイアウトに従っています。すなわち、Key-Value ペアがディレクトリとして等号記号(=)のセパレータでレイアウトされていて、パーティション キーが常に同じ順序になっています。
gs://my_bucket/my_table/dt=2019-10-31/lang=en/my_filename
gs://my_bucket/my_table/dt=2018-10-31/lang=fr/my_filename
この例で共通のソース URI プレフィックスは、gs://my_bucket/my_table
です。
サポートされないデータ レイアウト
ディレクトリ パス内でパーティション キー名がエンコードされていない場合、パーティション スキーマの検出は失敗します。たとえば、パーティション キー名をエンコードしない次のパスを考えてみましょう。
gs://my_bucket/my_table/2019-10-31/en/my_filename
スキーマの順序が一貫していないファイルも検出に失敗します。たとえば、逆パーティション キー エンコーディングを使用した次の 2 つのファイルについて考えてみましょう。
gs://my_bucket/my_table/dt=2019-10-31/lang=en/my_filename
gs://my_bucket/my_table/lang=fr/dt=2018-10-31/my_filename
検出モード
BigQuery では、以下の 3 つの Hive パーティション スキーマ検出モードがサポートされています。
AUTO
: キー名と型は自動検出されます。次の型を検出できます。STRINGS
: キー名は自動的にSTRING
型に変換されます。CUSTOM
: パーティション キースキーマはソース URI プレフィックスで指定されたとおりにエンコードされます。
カスタム パーティション キーのスキーマ
CUSTOM
スキーマを使用するには、ソース URI プレフィックス フィールドでスキーマを指定する必要があります。CUSTOM
スキーマを使用すると、各パーティション キーのタイプを指定できます。値は、指定された型で有効に解析される必要があります。そうでない場合、クエリは失敗します。
たとえば、source_uri_prefix
フラグを gs://my_bucket/my_table/{dt:DATE}/{val:STRING}
に設定すると、BigQuery は val
を STRING として処理し、dt
を DATE として処理して、gs://my_bucket/my_table
を一致したファイルのソース URI 接頭辞として使用します。
パーティションのプルーニング
BigQuery は、パーティション キーのクエリ述部を使用して、可能な場合はパーティションをプルーンします。これにより、BigQuery により不要なファイルの読み取りが行われなくなるため、パフォーマンスを向上できます。
クエリ内のパーティション キーに対する述語フィルタ
外部パーティション分割テーブルを作成する場合は、HivePartitioningOptions で requirePartitionFilter
オプションを有効にして、パーティション キーに対して述語フィルタの使用を要求できます。
このオプションを有効にした場合、WHERE
句を指定しないで外部パーティション分割テーブルにクエリを実行すると、次のエラーが発生します。Cannot query over table <table_name> without a filter over column(s)
<partition key names> that can be used for partition elimination
。
制限事項
- Hive パーティショニングのサポートは、すべての URI において、パーティション エンコードの直前に共通のソース URI プレフィックスがあるものと想定して構築されています。例:
gs://BUCKET/PATH_TO_TABLE/
。 - Hive パーティション分割テーブルのディレクトリ構造では、同じパーティショニング キーが同じ順序で表示され、テーブルごとに最大 10 個のパーティション キーがあると想定されます。
- データはデフォルトの Hive パーティショニング レイアウトに従う必要があります。
- Hive パーティショニング キーと基になるファイル内の列は重複できません。
サポートは GoogleSQL のみに対応しています。
Cloud Storage に保存されている外部データソースのクエリにはすべての制限が適用されます。
次のステップ
- パーティション分割テーブルについて学習する。
- BigQuery で SQL を使用する方法を学習する。