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

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

デフォルトでは、パーティション分割テーブルを明示的に作成しない限り、データの読み込み後に BigQuery でデータがパーティショニングされることはありません。

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

Hive パーティション分割データを読み込むには、次のいずれかのオプションを選択します。

コンソール

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

    [BigQuery] に移動

  2. [エクスプローラ] ペインでプロジェクトを開いて、データセットを選択します。
  3. アクションを表示)をクリックしてから、[テーブルを作成] をクリックします。[テーブルを作成] ペインが開きます。
  4. [送信元] セクションで、次の詳細を指定します。
    1. [テーブルの作成元] で [Google Cloud Storage] を選択します。
    2. [Select file from Cloud Storage bucket] に、ワイルドカードを使用して Cloud Storage フォルダへのパスを入力します。たとえば、my_bucket/my_files* のようにします。Cloud Storage バケットは、作成、追加、または上書きするテーブルを含むデータセットと同じロケーションに存在している必要があります。
    3. [ファイル形式] リストでファイル形式を選択します。
    4. [ソースデータ パーティショニング] チェックボックスをオンにして、[ソース URI の接頭辞を選択] に Cloud Storage URI の接頭辞を入力します。たとえば、gs://my_bucket/my_files のようにします。
    5. [パーティション推論モード] セクションで、次のいずれかのオプションを選択します。
      • 種類を自動的に推測します: パーティション スキーマ検出モードを AUTO に設定します。
      • すべての列は文字列です: パーティション スキーマ検出モードを STRINGS に設定します。
      • 独自に指定します: パーティション スキーマ検出モードを CUSTOM に設定し、パーティション キーのスキーマ情報を手動で入力します。詳細については、カスタム パーティション キー スキーマを指定するをご覧ください。
    6. 省略可: このテーブルのすべてのクエリでパーティション フィルタを必須にするには、[パーティション フィルタを要求] チェックボックスをオンにします。パーティション フィルタを要求すると、コストが削減され、パフォーマンスが向上する場合があります。詳細については、クエリ内のパーティション キーに対する必須の述語フィルタをご覧ください。
  5. [宛先] セクションで、次の詳細を指定します。
    1. [プロジェクト] で、テーブルを作成するプロジェクトを選択します。
    2. [データセット] で、テーブルを作成するデータセットを選択します。
    3. [テーブル] に、作成するテーブルの名前を入力します。
    4. [テーブルタイプ] で [ネイティブ テーブル] を選択します。
  6. [スキーマ] セクションでスキーマ定義を入力します。
  7. スキーマの自動検出を有効にするには、[自動検出] を選択します。
  8. スキーマと一致しない追加の列値を持つ行を無視するには、[詳細オプション] セクションを開いて [不明な値] を選択します。
  9. [テーブルを作成] をクリックします。

SQL

外部パーティション分割テーブルを作成するには、LOAD DATA ステートメントWITH PARTITION COLUMNS 句を使用してパーティション スキーマの詳細を指定します。

たとえば、外部でパーティション分割されたファイルを読み込むをご覧ください。

bq

自動パーティション キータイプ検出を使用して Hive パーティション分割データを読み込みます。

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

文字列型パーティション キー検出を使用して Hive パーティション分割データを読み込みます。

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

source\_uri\_prefix フィールドでエンコードされたカスタム パーティション キースキーマを使用して、Hive パーティション分割データを読み込みます。

bq load --source_format=JSON --hive_partitioning_mode=CUSTOM \
--hive_partitioning_source_uri_prefix=gcs_uri_shared_prefix/partition_key_schema \
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}

API

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

増分読み込みを実行する

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

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 列が入力されます。

パーティション スキーマ

以降のセクションでは、BigQuery がサポートするデフォルトの Hive パーティション分割レイアウトスキーマ検出モードについて説明します。

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

Cloud Storage からデータをクエリする場合、Hive パーティション キーは通常の列として表示されます。データはデフォルトの Hive パーティション分割レイアウトに従う必要があります。たとえば、次のファイルはデフォルトのレイアウトに従っています。すなわち、Key-Value ペアがディレクトリとして等号記号(=)のセパレータでレイアウトされていて、パーティション キーが常に同じ順序になっています。

gs://myBucket/myTable/dt=2019-10-31/lang=en/partitionKey
gs://myBucket/myTable/dt=2018-10-31/lang=fr/partitionKey

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

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

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

gs://myBucket/myTable/2019-10-31/en/partitionKey

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

gs://myBucket/myTable/dt=2019-10-31/lang=en/partitionKey
gs://myBucket/myTable/lang=fr/dt=2018-10-31/partitionKey

検出モード

BigQuery では、以下の 3 つの Hive パーティション スキーマ検出モードがサポートされています。

  • AUTO: キー名と型は自動検出されます。STRINGINTEGERDATETIMESTAMP の型を検出できます。
  • STRINGS: キー名は自動的に STRING 型に変換されます。
  • CUSTOM: パーティション キースキーマはソース URI プレフィックスで指定されたとおりにエンコードされます。

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

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

たとえば、source_uri_prefix フラグを gs://myBucket/myTable/{dt:DATE}/{val:STRING} に設定すると、BigQuery は val を STRING として処理し、dt を DATE として処理して、gs://myBucket/myTable を一致したファイルのソース URI プレフィックスとして使用します。

制限事項

  • Hive パーティショニングのサポートは、すべての URI において、パーティション エンコードの直前に共通のソース URI プレフィックスがあるものと想定して構築されています。例: gs://BUCKET/PATH_TO_TABLE/
  • Hive パーティション分割テーブルのディレクトリ構造では、同じパーティショニング キーが同じ順序で表示され、テーブルごとに最大 10 個のパーティション キーがあると想定されます。
  • データはデフォルトの Hive パーティショニング レイアウトに従う必要があります。
  • Hive パーティショニング キーと基になるファイル内の列は重複できません。
  • サポートは GoogleSQL のみに対応しています。

  • Cloud Storage からの読み込みに関する制限のすべてが適用されます。

次のステップ