外部でパーティションに分割されたデータのクエリ

BigQuery は、デフォルトの Hive パーティショニング レイアウトを使用して、Cloud Storage に保存されている Avro、Parquet、ORC、JSON、CSV 形式の外部パーティション データのクエリをサポートしています。Hive パーティショニングのサポートは、テーブル定義ファイルで適切なオプションを設定することにより有効化されます。現在、テーブルの作成と修正は CLIREST API でサポートされています。

管理パーティション分割テーブルでのクエリの手順については、パーティション分割テーブルの操作をご覧ください。

制限事項

  • Hive パーティショニングのサポートは、パーティション エンコードの直前に終了するすべての URI の共通ソース URI プレフィックスを想定して構築されます。これは gs://<bucket>/<path_to_table>/. のように見えます。
  • Hive パーティション分割テーブルのディレクトリ構造では、同じパーティション キーが同じ順序で表示され、テーブルごとに最大 10 個のパーティション キーがあると想定されます。
  • データはデフォルトの Hive パーティショニング レイアウトに従う必要があります。
  • Hive パーティショニング キーと基になるファイル内の列は重複できません。
  • 現在、テーブルの作成と変更は CLI と REST API に限定されています。
  • Cloud Storage に保存されている外部データソースのクエリにはすべての制限が適用されます。
  • サポートは標準 SQL に対してのみです。

サポートされるデータのレイアウト

データはのデフォルトの Hive 分割レイアウトに従う必要があります。たとえば、次のファイルはデフォルトのレイアウトに従っており、Key-Value ペアは、= 記号をセパレータとしてディレクトリとしてレイアウトされており、パーティション キーは常に同じ順序になっています。

gs://bucket/table/dt=2019-10-31/lang=en/foo
gs://bucket/table/dt=2018-10-31/lang=fr/bar

サポートされないデータのレイアウト

パーティション キー名がディレクトリ パスでエンコードされていない場合、パーティション スキーマの検出は失敗します。たとえば、パーティション キー名をエンコードしない次のパスを考えてみましょう。

gs://bucket/table/2019-10-31/en/foo

スキーマの順序が一貫していないファイルも検出に失敗します。たとえば、逆パーティション キー エンコーディングを使用した次の 2 つのファイルについて考えてみましょう。

gs://bucket/table/dt=2019-10-31/lang=en/foo
gs://bucket/table/lang=fr/dt=2018-10-31/bar

パーティション スキーマ検出モード

Cloud Storage からデータをクエリする場合、Hive パーティション キーは通常の列として表示されます。以下の Hive パーティション スキーマ検出の 3 つのモードがサポートされています。

  • AUTO: キーの名前とタイプは自動検出されます。次のタイプを検出できます。STRING、INTEGER、DATE、および TIMESTAMP。
  • STRINGS: キー名は、STRING タイプで自動的に推測されます。
  • CUSTOM: パーティション キー スキーマがソース URI 接頭辞でエンコードされています。

カスタム パーティション キー スキーマの指定

CUSTOM 検出では、ソース URI 接頭辞フィールドのスキーマをエンコードする必要があります。CUSTOM を使用すると、パーティション キーごとにユーザー指定の型を指定できます。値は、指定されたタイプとして有効に解析される必要があります。そうでない場合、クエリは失敗します。

たとえば、source_uri_prefix を gs://my_bucket/my_table/{dt:DATE}/{val:STRING} に設定すると val は STRING として処理され、dt は DATE として処理され、一致したファイルのソース URI 接頭辞として gs://my_bucket/my_table が抽出されます。

詳しくは、CLIREST API をご覧ください。

パーティションのプルーニング

BigQuery では、パーティション キーのクエリ述部を使用して可能な場合はパーティションをプルーンするため、不要なファイルの読み取りを回避できます。これにより、パフォーマンスが向上し、請求されるバイト数が減ることがあります。

課金

標準のクエリの料金に加えて、Hive パーティション分割テーブルのクエリに対して追加料金が発生します。

CLI を使用した HivePartitioningOptions の設定

HivePartitioningOptions は、テーブル定義ファイルの作成中に ExternalDataConfiguration オブジェクトに設定されます。

文字列型パーティション キー検出のリクエスト

bq mkdef --source_format=PARQUET --hive_partitioning_mode=STRINGS \
--hive_partitioning_source_uri_prefix=gcs_uri_shared_prefix \
gcs_uri >/tmp/table_def_file

source_uri_prefix フィールドでエンコードされたカスタム パーティション キースキーマの指定

bq mkdef --source_format=NEWLINE_DELIMITED_JSON --hive_partitioning_mode=CUSTOM \
--hive_partitioning_source_uri_prefix=gcs_uri_shared_prefix/custom_schema_encoding \
gcs_uris file_schema >/tmp/table_def_file

CUSTOM: パーティション キー スキーマはソース URI 接頭辞の直後にエンコードされます。--hive_partitioning_source_uri_prefix を指定するには、次の形式を使用します。

--hive_partitioning_source_uri_prefix=gcs_uri_shared_prefix/{key1:TYPE1}/{key2:TYPE2}/{key3:TYPE3}

REST API を使用した HivePartitioningOptions の設定

テーブル定義ファイルの作成時に ExternalDataConfigurationHivePartitioningOptions を設定することで Hive パーティショニングがサポートされます。

なお、hivePartitioningOptions.modeが CUSTOM に設定されている場合、hivePartitioningOptions.sourceUriPrefixgs://bucket/path_to_table/{key1:TYPE1}/{key2:TYPE2}/{key3:TYPE3} に設定してパーティション キー スキーマを sourceUriPrefix 内でエンコードする必要があるので注意してください。