Google Cloud Storage から ORC データを読み込む

このページでは、Cloud Storage から BigQuery への ORC データの読み込みの概要を説明します。

ORC は、Apache Hadoop エコシステムで広く使用されているオープンソースの列指向のデータ形式です。

ORC データを Cloud Storage から読み込む際に、新しいテーブルまたはパーティションにデータを読み込むことも、既存のテーブルまたはパーティションにデータを追加したり上書きしたりすることもできます。BigQuery に読み込まれたデータは Capacitor の列型(BigQuery のストレージ形式)に変換されます。

Cloud Storage から BigQuery のテーブルにデータを読み込むとき、読み込み先のテーブルを含むデータセットは Cloud Storage バケットと同じリージョンまたはマルチリージョン ロケーションに存在する必要があります。

ローカル ファイルから ORC データを読み込む方法については、ローカル データソースから BigQuery にデータを読み込むをご覧ください。

ORC スキーマ

ORC ファイルを BigQuery に読み込むと、自己記述型ソースデータから自動的にテーブル スキーマが取得されます。BigQuery がソースデータからスキーマを取得する際は、アルファベット順で最後のファイルが使用されます。

たとえば、Cloud Storage に次の ORC ファイルがあるとします。

gs://mybucket/00/
  a.orc
  z.orc
gs://mybucket/01/
  b.orc

次のコマンドでは、単一の CLI コマンドですべてのファイルが(カンマ区切りのリストとして)読み込まれ、スキーマは mybucket/01/b.orc から取得されます。

bq --location=US load --source_format=ORC [DATASET].[TABLE] "gs://mybucket/00/*.orc","gs://mybucket/01/*.orc"

BigQuery がスキーマを検出すると、一部の ORC データ型は、BigQuery SQL 構文に対応するように BigQuery データ型に変換されます。検出されたスキーマのすべてのフィールドは NULLABLE です。詳しくは ORC 変換をご覧ください。

異なるスキーマを持つ複数の ORC ファイルを読み込む場合、複数のスキーマで指定された同一のフィールド(名前とネストレベルが同じ)は、各スキーマ定義の同じ変換済み BigQuery データ型にマッピングする必要があります。

ORC 圧縮

圧縮 ORC ファイルはサポート対象外ですが、ファイルのフッターとストライプはサポート対象です。サポート対象の圧縮タイプは、Zlib、Snappy、LZO、LZ4 です。

ORC データを新しいテーブルに読み込む

ORC データを Google Cloud Storage から新しい BigQuery テーブルに読み込む、あるいは既存のテーブルにデータを追加するには:

ウェブ UI

  1. BigQuery ウェブ UI に移動します。
    BigQuery ウェブ UI に移動

  2. ナビゲーション パネルでデータセットにカーソルを合わせて下矢印アイコン 下矢印アイコン画像 をクリックし、[Create new table] をクリックします。データを読み込むプロセスは、空のテーブルを作成するプロセスと同じです。

  3. [Create Table] ページの [Source Data] セクションで、次の操作を行います。

    • [Location] で [Google Cloud Storage] を選択し、ソース フィールドに Cloud Storage URI を入力します。BigQuery ウェブ UI では複数の URI を指定できませんが、ワイルドカードはサポートされています。Cloud Storage バケットは、作成するテーブルを含むデータセットと同じロケーションにある必要があります。
    • [File format] で [ORC] を選択します。
  4. [Create Table] ページの [Destination Table] セクションで、次の操作を行います。
    • [Table name] で、適切なデータセットを選択し、BigQuery で作成するテーブルの名前をテーブル名のフィールドに入力します。
    • [Table type] が [Native table] に設定されていることを確認します。
  5. [Schema] セクションでは、何もする必要はありません。スキーマは ORC ファイルで自己記述されます。
  6. [Create Table] をクリックします。

コマンドライン

bq load コマンドを使用し、source_format として ORC を指定して、Cloud Storage URI を含めます。単一の URI、URI のカンマ区切りリスト、またはワイルドカードを含む URI を指定できます。

--location フラグを指定し、その値を該当するロケーションに設定します。

bq --location=[LOCATION] load --source_format=[FORMAT] [DATASET].[TABLE] [PATH_TO_SOURCE]

各項目の説明は次のとおりです。

  • [LOCATION] はユーザーのロケーションです。データが US または EU のマルチリージョン ロケーションにある場合は、--location フラグを省略できます。たとえば、BigQuery を東京リージョンで使用している場合は、このフラグの値を asia-northeast1 に設定します。.bigqueryrc ファイルを使用してロケーションのデフォルト値を設定できます。
  • [FORMAT]ORC です。
  • [DATASET] は既存のデータセットです。
  • [TABLE] は、データの読み込み先のテーブル名です。
  • [PATH_TO_SOURCE] は、完全修飾された Cloud Storage URI または URI のカンマ区切りリストです。ワイルドカードも使用できます。

例:

  • 次のコマンドは、gs://mybucket/mydata.orc から mydatasetmytable という名前のテーブルにデータを読み込みます。mybucketmydatasetUS マルチリージョン ロケーションに作成されています。

    bq --location=US load --source_format=ORC mydataset.mytable gs://mybucket/mydata.orc
    
  • 次のコマンドは、gs://mybucket/ の複数のファイルから mydatasetmytable という名前のテーブルにデータを読み込みます。Cloud Storage の URI ではワイルドカードを使用しています。 mybucketmydatasetUS マルチリージョン ロケーションに作成されています。

    bq --location=US load --source_format=ORC mydataset.mytable gs://mybucket/mydata*.orc
    
  • 次のコマンドは、gs://mybucket/ の複数のファイルから mydatasetmytable という名前のテーブルにデータを読み込みます。このコマンドでは、Cloud Storage の URI のカンマ区切りのリストをワイルドカード付きで使用しています。mybucketmydatasetasia-northeast1 リージョンに作成されています。

    bq --location=asia-northeast1 load --autodetect --source_format=ORC mydataset.mytable "gs://mybucket/00/*.orc","gs://mybucket/01/*.orc"
    

API

API を使用して ORC データを読み込むには、次のプロパティを設定します。

  1. Google Cloud Storage のソースデータを指す読み込みジョブを作成します。

  2. ジョブリソースjobReference セクションにある location プロパティにロケーションを指定します。

  3. ソース URI は、完全修飾された gs://[BUCKET]/[OBJECT] 形式にする必要があります。各 URI に「*」ワイルドカード文字を 1 つ含めることができます。

  4. configuration.load.sourceFormat プロパティを ORC に設定して ORC データ形式を指定します。

  5. ジョブ ステータスをチェックするには、jobs.get([JOB_ID]*) を呼び出します。[JOB_ID] は、最初のリクエストによって返されたジョブの ID です。

    • status.state = DONE の場合、ジョブは正常に完了しています。
    • status.errorResult プロパティが存在する場合はリクエストが失敗し、そのオブジェクトにはエラーを説明する情報が格納されます。リクエストが失敗した場合、テーブルは作成されず、データは追加されません。

    • status.errorResult が存在しない場合、ジョブは正常に完了していますが、一部の行のインポートで問題があったなど、致命的でないエラーが発生した可能性があります。致命的でないエラーは、返されたジョブ オブジェクトの status.errors プロパティに格納されています。

API に関する注:

  • 読み込みジョブはアトミックで一貫性があります。読み込みジョブが失敗した場合、データは一切利用できず、読み込みジョブが成功した場合、すべてのデータが利用可能です。

  • jobs.insert() を呼び出して読み込みジョブを作成する場合、一意の ID を作成し、その ID を jobReference.jobId として渡すことをおすすめします。この手法を使用すると、クライアントが既知のジョブ ID を使用してポーリングまたは再試行できるため、ネットワーク障害に強くなります。

  • 特定のジョブ ID で jobs.insert() を呼び出すことは「べき等」です。つまり、同じジョブ ID で何度でも再試行でき、成功するオペレーションはそのうち多くても 1 回だけです(複数回のオペレーションが成功することはありません)。

Go

このサンプルを試す前に、クライアント ライブラリを使用する BigQuery Quickstart の Go の設定手順に従ってください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
gcsRef := bigquery.NewGCSReference("gs://cloud-samples-data/bigquery/us-states/us-states.orc")
gcsRef.SourceFormat = bigquery.ORC
loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(gcsRef)

job, err := loader.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}

if status.Err() != nil {
	return fmt.Errorf("Job completed with error: %v", status.Err())
}

Python

このサンプルを試す前に、クライアント ライブラリを使用する BigQuery Quickstart の Python の設定手順に従ってください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_id = 'my_dataset'

dataset_ref = client.dataset(dataset_id)
job_config = bigquery.LoadJobConfig()
job_config.source_format = bigquery.SourceFormat.ORC
uri = 'gs://cloud-samples-data/bigquery/us-states/us-states.orc'

load_job = client.load_table_from_uri(
    uri,
    dataset_ref.table('us_states'),
    job_config=job_config)  # API request
print('Starting job {}'.format(load_job.job_id))

load_job.result()  # Waits for table load to complete.
print('Job finished.')

destination_table = client.get_table(dataset_ref.table('us_states'))
print('Loaded {} rows.'.format(destination_table.num_rows))

ORC データをテーブルに上書きする

テーブルに追加のデータを読み込むには、ソースファイルを使用するか、クエリ結果を追加します。

BigQuery ウェブ UI では、[Write preference] オプションを使用して、ソースファイルまたはクエリ結果からデータを読み込むときに実行する操作を指定します。CLI と API には次のオプションがあります。

ウェブ UI のオプション CLI のフラグ BigQuery API のプロパティ 説明
Write if empty なし WRITE_EMPTY テーブルが空の場合にのみデータを書き込みます。
Append to table --noreplace または --replace=false--[no]replace が指定されていない場合、デフォルトは追加です。 WRITE_APPEND (デフォルト)テーブルの末尾にデータを追加します。
Overwrite table --replace または --replace=true WRITE_TRUNCATE 新しいデータを書き込む前に、テーブル内の既存のデータをすべて消去します。

デフォルトでは、書き込み処理が変更されない限り、読み込みジョブはデータをテーブルに追加します。読み込みジョブのデータでデータを置き換える場合は、BigQuery テーブルのデータの上書きを選択できます。

ウェブ UI

  1. BigQuery ウェブ UI に移動します。
    BigQuery ウェブ UI に移動

  2. ナビゲーション パネルでデータセットにカーソルを合わせて下矢印アイコン 下矢印アイコン画像 をクリックし、[Create new table] をクリックします。データを読み込むプロセスは、空のテーブルを作成するプロセスと同じです。

  3. [Create Table] ページの [Source Data] セクションで、次の操作を行います。

    • [Location] で [Google Cloud Storage] を選択し、ソース フィールドに Cloud Storage URI を入力します。UI では複数の URI を指定できませんが、ワイルドカードはサポートされています。Cloud Storage バケットは、データを追加または上書きするテーブルを含むデータセットと同じロケーションにある必要があります。
    • [File format] で [ORC] を選択します。
  4. [Create Table] ページの [Destination Table] セクションで、次の操作を行います。
    • [Table name] で、適切なデータセットを選択し、追加または上書きするテーブルの名前をテーブル名フィールドに入力します。
    • [Table type] が [Native table] に設定されていることを確認します。
  5. [Schema] セクションでは、何もする必要はありません。スキーマ情報は ORC ファイルで自己記述されます。
  6. [Options] セクションの [Write preference] で、[Write if empty]、[Append to table]、[Overwrite table] のいずれかを選択します。

    [Add Field] を使用してスキーマを追加する

  7. [Create Table] をクリックします。

コマンドライン

テーブルを上書きするには、--replace フラグを指定して bq load コマンドを入力します。--location フラグを指定し、その値を該当するロケーションに設定します。テーブルにデータを追加するには、--noreplace フラグを使用します。フラグを指定しない場合、デフォルトではデータが追加されます。

bq --location=[LOCATION] load --[no]replace [DATASET].[TABLE] [PATH_TO_SOURCE]

ここで

  • [LOCATION]ロケーションです。データが US または EU のマルチリージョン ロケーションにある場合は、--location フラグを省略できます。.bigqueryrc ファイルを使用してロケーションのデフォルト値を設定できます。
  • [DATASET] は既存のデータセットです。
  • [TABLE] は、データの読み込み先のテーブル名です。
  • [PATH_TO_SOURCE] は、完全修飾された Cloud Storage URI または URI のカンマ区切りリストです。ワイルドカードも使用できます。

例:

  • 次のコマンドは、gs://mybucket/mydata.orc からデータを読み込んで mydatasetmytable という名前のテーブルを上書きします。mybucketmydatasetUS マルチリージョン ロケーションに作成されています。

    bq --location=US load --replace --source_format=ORC mydataset.mytable gs://mybucket/mydata.orc
    
  • 次のコマンドは、gs://mybucket/mydata.orc からデータを読み込んで mydatasetmytable という名前のテーブルに追加します。mybucketmydatasetasia-northeast1 リージョンに作成されています。

    bq --location=asia-northeast1 load --noreplace --source_format=ORC mydataset.mytable gs://mybucket/mydata.orc
    

API

API を使用して CSV データを読み込むには、次のプロパティを設定します。

  1. Google Cloud Storage のソースデータを指す読み込みジョブを作成します。

  2. ジョブリソースjobReference セクションにある location プロパティにロケーションを指定します。

  3. ソース URI は、完全修飾された gs://[BUCKET]/[OBJECT] 形式にする必要があります。複数の URI をカンマ区切りのリストとして含めることができます。Google Cloud Storage から CSV データを読み込む場合、ワイルドカードを使用することもできます。

  4. configuration.load.sourceFormat プロパティを ORC に設定して、データ形式を指定します。

  5. configuration.load.writeDisposition プロパティを WRITE_TRUNCATEWRITE_APPENDWRITE_EMPTY に設定して、書き込み設定を指定します。読み込みジョブの場合、デフォルト モードは WRITE_APPEND です。

Go

このサンプルを試す前に、クライアント ライブラリを使用する BigQuery Quickstart の Go の設定手順に従ってください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
gcsRef := bigquery.NewGCSReference("gs://cloud-samples-data/bigquery/us-states/us-states.orc")
gcsRef.SourceFormat = bigquery.ORC
loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(gcsRef)
// Default for import jobs is to append data to a table.  WriteTruncate
// specifies that existing data should instead be replaced/overwritten.
loader.WriteDisposition = bigquery.WriteTruncate

job, err := loader.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}

if status.Err() != nil {
	return fmt.Errorf("Job completed with error: %v", status.Err())
}

Python

このサンプルを試す前に、クライアント ライブラリを使用する BigQuery Quickstart の Python の設定手順に従ってください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

既存のテーブルの行を置換するには、LoadJobConfig.write_disposition プロパティWRITE_TRUNCATE に設定します。

# from google.cloud import bigquery
# client = bigquery.Client()
# table_ref = client.dataset('my_dataset').table('existing_table')

previous_rows = client.get_table(table_ref).num_rows
assert previous_rows > 0

job_config = bigquery.LoadJobConfig()
job_config.write_disposition = bigquery.WriteDisposition.WRITE_TRUNCATE
job_config.source_format = bigquery.SourceFormat.ORC
uri = 'gs://cloud-samples-data/bigquery/us-states/us-states.orc'
load_job = client.load_table_from_uri(
    uri,
    table_ref,
    job_config=job_config)  # API request
print('Starting job {}'.format(load_job.job_id))

load_job.result()  # Waits for table load to complete.
print('Job finished.')

destination_table = client.get_table(table_ref)
print('Loaded {} rows.'.format(destination_table.num_rows))

ORC 変換

BigQuery は ORC のデータ型を次の BigQuery データ型に変換します。

プリミティブ型

ORC のデータ型 BigQuery のデータ型
boolean BOOLEAN
byte INTEGER
short INTEGER
int INTEGER
long INTEGER
float FLOAT
double FLOAT
string STRING UTF-8 のみ
varchar STRING UTF-8 のみ
char STRING UTF-8 のみ
binary BYTES
date DATE
timestamp TIMESTAMP ORC はナノ秒単位の精度をサポートしますが、BigQuery はデータを読み取るときにマイクロ秒以下の値をマイクロ秒に変換します。
decimal NUMERIC または STRING NUMERIC 型は、38 桁の精度と 9 桁の小数点以下の桁数を持つ正確な数値です。詳細については、NUMERIC 型をご覧ください。ORC スキーマの小数点以下の桁数が 9 以下で、精度尺度が 29 以下の場合は、NUMERIC に変換されます。それ以外の場合は、STRING に変換されます。decimal 型が STRING に変換されると、警告メッセージが返されます。

複合型

ORC のデータ型 BigQuery のデータ型
struct RECORD
  • すべてのフィールドは NULLABLE です。
  • フィールドの順序は無視されます。
  • フィールドの名前は有効な列名にする必要があります。
map<K,V> RECORD ORC の map<K,V> フィールドは、2 つのフィールド(K と同じデータ型のキー、V と同じデータ型の値)を含む、繰り返し RECORD に変換されます。両方のフィールドが NULLABLE です。
list 繰り返しフィールド ネストされたリストとマップのリストはサポートされていません。
union RECORD
  • union に 1 つのバリアントしかない場合は、NULLABLE フィールドに変換されます。
  • それ以外の場合は、union は NULLABLE フィールドのリストを持つ RECORD に変換されます。NULLABLE フィールドには、field_0、field_1 などの接尾辞が付きます。データを読み取るときに、このようなフィールドの 1 つのみに値が割り当てられます。

列名

列名には、英字(a-z、A-Z)、数字(0-9)、アンダースコア(_)のみを含める必要があり、英字またはアンダースコアで始まる必要があります。列名の最大長は 128 文字です。列名には、次の接頭辞のいずれも使用できません。

  • _TABLE_
  • _FILE_
  • _PARTITION

大文字と小文字が異なっている場合でも、重複する列名は使用できません。たとえば、Column1 という列は column1 という列と同じとみなされます。

NULL

現在、BigQuery はすべての ORC データ型の NULL 値を無視します。

ORC のデータ型の詳細については、Apache ORC™ Specification v1 をご覧ください。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。