スキーマの自動検出の使用

スキーマの自動検出

スキーマの自動検出は、BigQuery にデータを読み込む場合や、外部データソースに対してクエリを実行する場合に使用できます。

自動検出を有効にすると、BigQuery はデータソース内でランダムにファイルを選択します。ファイルの最大 100 行をスキャンして代表的なサンプルとして使用し、推定プロセスを開始します。BigQuery は、各フィールドを検証し、そのサンプル内の値に基づいてそのフィールドにデータ型を割り当てようとします。

テーブルで検出されたスキーマを確認するには:

  • コマンドライン ツールの bq show コマンドを使用します。
  • BigQuery ウェブ UI を使用して、テーブルのスキーマを表示します。

BigQuery がスキーマを検出するときに、BigQuery SQL 構文に対応させるためにフィールド名が変更されることがまれにあります。

データ型変換について詳しくは、以下をご覧ください。

スキーマ自動検出を使用したデータの読み込み

データの読み込み時にスキーマの自動検出を有効にするには:

  • GCP Console: [スキーマ] セクションの [自動検出] で、[スキーマと入力パラメータ] オプションをオンにします。
  • 従来の BigQuery ウェブ UI: [Schema] セクションで、[Automatically detect] オプションをオンにします。
  • CLI: bq load コマンドを使用して --autodetect パラメータを指定します。

有効にすると、BigQuery は CSV と JSON ファイルのスキーマを可能な限り自動的に推測します。

Avro、Parquet、ORC の各ファイル、Cloud Firestore と Cloud Datastore のエクスポート ファイルには、スキーマの自動検出を使用できません。これらのファイルを BigQuery に読み込むと、自己記述型ソースデータから自動的にテーブル スキーマが取得されます。

JSON や CSV データを読み込むときにスキーマの自動検出を使用するには:

従来の UI

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

  2. ナビゲーション内のデータセット名の横にある下矢印アイコン 下矢印アイコン をクリックし、[Create new table] をクリックします。

    注: UI のデータを読み込むプロセスは、テーブルを作成するプロセスと同じです。
  3. [Create table] ページで:

    • [Source Data] で、[Create from source] をクリックします。
    • [Destination Table] で、データセットを選択し、[Destination table name] フィールドにテーブル名を入力します。
    • [Schema] で、[Automatically detect] をクリックしてスキーマを特定します。

      自動検出リンク

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

CLI

--autodetect パラメータを指定して bq load コマンドを発行します。--location フラグを指定し、その値を該当するロケーションに設定します。

次のコマンドでは、スキーマの自動検出を使用してファイルを読み込みます。

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

ここで

  • [LOCATION] はロケーションの名前です。--location フラグは省略可能です。たとえば、BigQuery を東京リージョンで使用している場合は、このフラグの値を asia-northeast1 に設定します。.bigqueryrc ファイルを使用してロケーションのデフォルト値を設定できます。
  • [FORMAT]NEWLINE_DELIMITED_JSON または CSV です。
  • [DATASET] は、データを読み込むテーブルを含むデータセットです。
  • [TABLE] は、データの読み込み先のテーブル名です。
  • [PATH_TO_SOURCE] は、CSV または JSON ファイルの場所です。

例:

次のコマンドを入力すると、ローカルマシンから、mydataset というデータセットに保存された mytable というテーブルに myfile.csv が読み込まれます。mydataset は、US マルチリージョン ロケーションに作成されています。

bq --location=US load --autodetect --source_format=CSV mydataset.mytable ./myfile.csv

次のコマンドを入力すると、ローカルマシンから、mydataset というデータセットに保存された mytable というテーブルに myfile.csv が読み込まれます。mydataset は、asia-northeast1 リージョンに作成されています。

bq --location=asia-northeast1 load --autodetect --source_format=CSV mydataset.mytable ./myfile.csv

API

  1. ソースデータを指す読み込みジョブを作成します。ジョブの作成について詳しくは、プログラムによる BigQuery ジョブの実行をご覧ください。jobReference セクションの location プロパティに、該当するロケーションを指定します。

  2. configuration.load.sourceFormat プロパティを設定してデータ形式を指定します。スキーマの自動検出を使用するには、この値を NEWLINE_DELIMITED_JSON または CSV に設定する必要があります。

  3. configuration.load.autodetect プロパティを使用してスキーマの自動検出を true に設定します。

Go

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用の 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.json")
gcsRef.SourceFormat = bigquery.JSON
gcsRef.AutoDetect = true
loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(gcsRef)
loader.WriteDisposition = bigquery.WriteEmpty

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 クイックスタート: クライアント ライブラリの使用の Python の設定手順に従ってください。 詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

スキーマの自動検出を有効にするには、LoadJobConfig.autodetect プロパティを True に設定します。

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

dataset_ref = client.dataset(dataset_id)
job_config = bigquery.LoadJobConfig()
job_config.autodetect = True
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON
uri = 'gs://cloud-samples-data/bigquery/us-states/us-states.json'
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))

外部データソースのスキーマ自動検出

外部データソースにリンクするテーブルを作成するときに、スキーマの自動検出を有効にするには:

  • GCP Console の [自動検出] で、[スキーマと入力パラメータ] オプションをオンにします。
  • 従来の BigQuery ウェブ UI で、[Automatically detect] オプションをオンにします。

有効にすると、BigQuery は CSV と JSON の外部データソースのスキーマを可能な限り自動的に推測します。

現在、GCP Console または従来のウェブ UI を使用して、Google スプレッドシート外部データソースに対してスキーマの自動検出を有効にすることはできません。また、スキーマの自動検出は、Avro ファイル、Cloud Firestore のエクスポート ファイル、Cloud Datastore のエクスポート ファイルでは使用されません。このようなファイル形式のいずれかにリンクするテーブルを作成すると、BigQuery は自己記述型のソースデータからスキーマを自動的に取得します。

CLI の場合、CSV、JSON、Google スプレッドシート データにテーブル定義ファイルを作成するときに、スキーマの自動検出を有効にできます。CLI を使用してテーブル定義ファイルを作成するときに、スキーマの自動検出を有効にするには --autodetect フラグを、自動検出を無効にするには --noautodetect フラグを mkdef コマンドに渡します。

--autodetect フラグを使用するときに、テーブル定義ファイルで "autodetect"true に設定します。--noautodetect フラグを使用する場合には、"autodetect"false に設定します。テーブル定義の作成時に外部データソースのスキーマを定義しない場合や、--noautodetect または --autodetect フラグを使用しない場合、"autodetect" がデフォルトの true に設定されます。

API を使用してテーブル定義ファイルを作成する場合は、"autodetect" プロパティの値を true または false に設定します。autodetecttrue に設定すると、自動検出が有効になります。autodetectfalse に設定すると、無効になります。

自動検出の詳細

自動検出は、スキーマの詳細だけでなく、次のことをも認識します。

圧縮

BigQuery は、ファイルを開くときに gzip 互換ファイル圧縮を認識します。

CSV 区切り文字

BigQuery は以下の区切り文字を検出します。

  • カンマ(,)
  • パイプ(|)
  • タブ(\t)

CSV ヘッダー

BigQuery は、ファイルの最初の行をデータセット内の他の行と比較することでヘッダーを推定します。最初の行には文字列のみが含まれ、他の行はそうではない場合、BigQuery はその最初の行がヘッダー行であると想定します。

CSV 引用符付き改行

BigQuery は、CSV フィールド内の引用符付き改行文字を検出し、引用符付き改行文字を行境界として解釈しません。

日付

JSON や CSV データにスキーマの検出を使用する場合、DATE 列の値に区切りとしてダッシュ(-)を使用し、YYYY-MM-DD(年-月-日)の形式にする必要があります。

タイムスタンプ

BigQuery は、以下のような幅広いタイムスタンプ形式を検出します(ただし、これらに限定されません)。

  • yyyy-mm-dd
  • yyyy-mm-dd hh:mm:ss
  • yyyy-mm-dd hh:mm:ss.mmm

タイムスタンプには、UTC オフセットと UTC ゾーン指定子 Z を含めることもできます。整数ベースのタイムスタンプ値もサポートされています。

JSON や CSV データにスキーマの検出を使用する場合、TIMESTAMP 列の値の日付部分に区切りとしてダッシュ(-)を使用し、YYYY-MM-DD(年-月-日)の形式にする必要があります。タイムスタンプの時間部分 hh:mm:ss(時-分-秒)には、区切りとしてコロン(:)を使用します。

タイムスタンプの例

BigQuery によって自動的に検出されるタイムスタンプ形式の例を次に示します。

  • 253402300799
  • 2017-07-05 12:54:00 UTC
  • 2017-08-19 07:11:35.220 -05:00
  • 2017-07-05 12:54:00 UTC
  • 2017-08-19T12:11:35.220Z
  • 2.53402300799e11
  • 2018-08-19 12:11:35.220000
  • 2018-08-19 12:11:35.220
このページは役立ちましたか?評価をお願いいたします。

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

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