外部パーティション分割データの読み込み

BigQuery では、Hive パーティショニング レイアウトを使用して Cloud Storage に保存されているデータを読み込むことができます。Hive パーティショニングを使用すると、外部データを複数のファイルに整理し、命名規則でファイルを異なるパーティションに分割できます。詳細については、このページのサポートされるデータ レイアウトをご覧ください。

制限事項

  • Hive パーティショニングのサポートは、すべての URI において、パーティション エンコードの直前に共通のソース URI プレフィックスがあるものと想定して構築されています。例: gs://<bucket>/<path_to_table>/
  • Hive パーティション分割テーブルのディレクトリ構造は、同じパーティショニング キーが同じ順序で出現し、テーブルごとに最大 10 個のパーティショニング キーがあると想定されています。
  • データはデフォルトの Hive パーティショニング レイアウトに従う必要があります。
  • 基盤となるファイルの中で、Hive パーティショニング キーと列は重複してはいけません。
  • Cloud Storage からの読み込みに関する制限のすべてが適用されます。

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

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

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

この例で共通のソース URI プレフィックスは、gs://bucket/table です。

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

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

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: キーの名前と型は自動検出されます。次の型を検出できます。STRINGINTEGERDATETIMESTAMP
  • STRINGS: キー名は、STRING 型で自動的に推定されます。
  • CUSTOM: パーティション キースキーマがソース URI プレフィックスでエンコードされています。

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

CUSTOM 検出では、ソース URI プレフィックス フィールド内にパーティション キー名と型の組み合わせを指定して、スキーマをエンコードする必要があります。値は、指定された型で有効に解析される必要があります。そうでない場合、読み込みは失敗します。

たとえば、source_uri_prefix を gs://my_bucket/my_table/{dt:DATE}/{val:STRING} に設定すると、valSTRING として、dtDATE として扱われ、gs://my_bucket/my_table は一致するファイルのソース URI プレフィックスとして抽出されます。

詳しくは、Google Cloud Consolebq コマンドライン ツールREST API をご覧ください。

増分読み込みの実行

次のデータ レイアウトについて考えてみます。

gs://my_bucket/my_table/dt=2019-10-31/val=1/file1
gs://my_bucket/my_table/dt=2018-10-31/val=2/file2
gs://my_bucket/my_table/dt=2017-10-31/val=3/file3
gs://my_bucket/my_table/dt=2016-10-31/val=4/file4

2019-10-31 のみからデータを読み込むには、次の操作を行います。

  • Hive パーティショニング モードを AUTOSTRINGS、または CUSTOM に設定します。
  • Hive パーティショニング モードが AUTO または STRINGS の場合は、ソース URI プレフィックスを gs://my_bucket/my_table/ に設定します。CUSTOM の場合は、gs://my_bucket/my_table/{dt:DATE}/{val:INTEGER} を指定します。
  • URI gs://my_bucket/my_table/dt=2019-10-31/* を使用します。
  • dt 列と val 列が含まれたデータが読み込まれます。それぞれの値は 2019-10-311 です。

特定のファイルのみからデータを読み込むには、次の操作を行います。

  • Hive パーティショニング モードを AUTOSTRINGS、または CUSTOM に設定します。
  • Hive パーティショニング モードが AUTO または STRINGS の場合は、ソース URI プレフィックスを gs://my_bucket/my_table/ に設定します。CUSTOM には gs://my_bucket/my_table/{dt:DATE}/{val:INTEGER} を指定します。
  • URI gs://my_bucket/my_table/dt=2017-10-31/val=3/file3,gs://my_bucket/my_table/dt=2016-10-31/val=4/file4 を使用します。
  • 2 つのファイルからデータが読み込まれます。dt 列と val 列が入力されます。

Cloud Console を使用して Hive パーティショニング データを読み込む

Cloud Console で Hive パーティショニング データを読み込むには、次の手順に沿って操作します。

  1. Cloud Console で、BigQuery ページに移動します。

    BigQuery に移動

  2. [エクスプローラ] パネルでプロジェクトを展開し、データセットを選択します。

  3. [アクションを表示] > [開く] をクリックします。

  4. 詳細パネルで [テーブルを作成] をクリックします。

  5. [テーブルの作成元] プルダウン リストから [Google Cloud Storage] を選択します。

  6. 次のオプションを設定します。

    • [GCS バケットからファイルを選択] フィールドにデータセットのパスを入力し、プルダウン リストからそのファイルタイプを選択します。
    • [ソースデータ パーティショニング] ボックスをオンにして、ソース URI プレフィックスを入力します。
    • [パーティション推論モード] セクションで、次のいずれかのオプションを選択します。
      • パーティション スキーマ検出モードを AUTO に設定する場合は、[種類を自動的に推測します] を選択します。
      • パーティション スキーマ検出モードを STRINGS に設定する場合は、[すべての列は文字列です] を選択します。
      • パーティション スキーマ検出モードを CUSTOM に設定し、パーティション キーのスキーマ情報を手動で入力する場合は、[独自に指定します] を選択します。詳細については、カスタム パーティション キー スキーマの指定をご覧ください。
    • [テーブルタイプ] プルダウン リストから、[ネイティブ テーブル] を選択します。
    • [テーブル名] フィールドでテーブルの名前を指定します。
  7. [テーブルを作成] をクリックします。

bq コマンドライン ツールを使用して Hive パーティショニング データを読み込む

パーティション キーの型の自動検出のリクエスト

bq load --source_format=ORC --hive_partitioning_mode=AUTO \
--hive_partitioning_source_uri_prefix=gcs_uri_shared_prefix \
dataset.table gcs_uris

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

bq load --source_format=PARQUET --autodetect \
--hive_partitioning_mode=STRINGS \
--hive_partitioning_source_uri_prefix=gcs_uri_shared_prefix \
dataset.table gcs_uris

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

bq load --source_format=JSON --hive_partitioning_mode=CUSTOM \
--hive_partitioning_source_uri_prefix=gcs_uri_shared_prefix/custom_schema_encoding \
dataset.table gcs_uris file_schema

パーティション キースキーマはソース URI プレフィックスの直後にエンコードされます。次の形式を使用して --hive_partitioning_source_uri_prefix を指定してください。

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

REST API を使用して Hive パーティショニング データを読み込む

ExternalDataConfigurationHivePartitioningOptions を設定することで Hive パーティショニングがサポートされます。

なお、hivePartitioningOptions.modeCUSTOM に設定されている場合、hivePartitioningOptions.sourceUriPrefix フィールドのパーティション キースキーマを次のようにエンコードする必要があります。gs://BUCKET/PATH_TO_TABLE/{KEY1:TYPE1}/{KEY2:TYPE2}/...

クエリの実行時に述語フィルタの使用を強制するには、hivePartitioningOptions.requirePartitionFilter フィールドを true に設定します。