Cloud Storage からの Parquet データの読み込み

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

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

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

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

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

Parquet のスキーマ

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

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

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

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

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

異なるスキーマを持つ複数の Parquet ファイルを読み込む場合、複数のスキーマで指定された同一の列は、各スキーマ定義内で同じモードである必要があります。

BigQuery がスキーマを検出すると、一部の Parquet データ型は、BigQuery SQL 構文に対応するように BigQuery データ型に変換されます。詳細については、Parquet の変換をご覧ください。

Parquet 圧縮

圧縮 Parquet ファイルはサポートされていませんが、圧縮データブロックはサポートされています。BigQuery では、Parquet ファイルの圧縮データブロックに対して Snappy コーデック、GZip コーデック、および LZO_1X コーデックがサポートされています。

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

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

Console

  1. GCP Console で BigQuery ウェブ UI を開きます。
    BigQuery ウェブ UI に移動

  2. ナビゲーション パネルの [リソース] セクションでプロジェクトを展開し、データセットを選択します。

  3. ウィンドウの右側の詳細パネルで、[テーブルを作成] をクリックします。データを読み込むプロセスは、空のテーブルを作成するプロセスと同じです。

    テーブルを作成

  4. [テーブルの作成] ページの [ソース] セクションで、次の操作を行います。

    • [テーブルの作成元] で、希望するソースタイプを選択します。

      テーブルソースを作成

    • ソース フィールドで、ファイル / Cloud Storage バケットを参照するか、Cloud Storage URI を入力します。BigQuery ウェブ UI では URI の複数指定はできませんが、ワイルドカードはサポートされています。Cloud Storage バケットは、作成するテーブルを含むデータセットと同じロケーションに存在している必要があります。

      ファイルを選択

    • [ファイル形式] で、[Parquet] を選択します。

  5. [テーブルを作成] ページの [送信先] セクションで、次の操作を行います。

    • [データセット名] で、該当するデータセットを選択します。

      データセットを表示

    • [テーブル名] フィールドに、BigQuery で作成するテーブルの名前を入力します。

    • [テーブルタイプ] が [ネイティブ テーブル] に設定されていることを確認します。

  6. [Schema] セクションでは、何もする必要はありません。スキーマは、Parquet ファイルで自己記述されます。

  7. [詳細オプション] セクションで該当する項目を選択し、[テーブルを作成] をクリックします。

従来の UI

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

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

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

    • [Location] で [Cloud Storage] を選択し、ソース フィールドに Cloud Storage URI を入力します。BigQuery ウェブ UI では URI の複数指定はできませんが、ワイルドカードはサポートされています。Cloud Storage バケットは、作成するテーブルを含むデータセットと同じロケーションに存在している必要があります。
    • [File format] で、[Parquet] を選択します。
  • [Create Table] ページの [Destination Table] セクションで、次の操作を行います。

    • [Table name] で適切なデータセットを選択し、BigQuery で作成するテーブルの名前をテーブル名のフィールドに入力します。
    • [Table type] が [Native table] に設定されていることを確認します。
  • [Schema] セクションでは、何もする必要はありません。スキーマは、Parquet ファイルで自己記述されます。

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

  • コマンドライン

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

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

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

    ここで

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

    例:

    • 次のコマンドは、gs://mybucket/mydata.parquet から、mydataset 内の mytable というテーブルにデータを読み込みます。mybucketmydataset は、US マルチリージョン ロケーションに存在します。

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

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

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

    API

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

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

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

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

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

    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 クイックスタート: クライアント ライブラリの使用の 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.parquet")
    gcsRef.SourceFormat = bigquery.Parquet
    gcsRef.AutoDetect = true
    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())
    }

    Java

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

    String sourceUri = "gs://cloud-samples-data/bigquery/us-states/us-states.parquet";
    TableId tableId = TableId.of(datasetName, "us_states");
    LoadJobConfiguration configuration =
            LoadJobConfiguration.builder(tableId, sourceUri)
                    .setFormatOptions(FormatOptions.parquet())
                    .build();
    // Load the table
    Job loadJob = bigquery.create(JobInfo.of(configuration));
    loadJob = loadJob.waitFor();
    // Check the table
    StandardTableDefinition destinationTable = bigquery.getTable(tableId).getDefinition();
    System.out.println("State: " + loadJob.getStatus().getState());
    System.out.printf("Loaded %d rows.\n", destinationTable.getNumRows());

    Node.js

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

    // Import the Google Cloud client libraries
    const {BigQuery} = require('@google-cloud/bigquery');
    const {Storage} = require('@google-cloud/storage');
    
    /**
     * TODO(developer): Uncomment the following lines before running the sample.
     */
    // const datasetId = "my_dataset";
    // const tableId = "my_table";
    
    /**
     * This sample loads the Parquet file at
     * https://storage.googleapis.com/cloud-samples-data/bigquery/us-states/us-states.parquet
     *
     * TODO(developer): Replace the following lines with the path to your file.
     */
    const bucketName = 'cloud-samples-data';
    const filename = 'bigquery/us-states/us-states.parquet';
    
    async function loadTableGCSParquet() {
      // Imports a GCS file into a table with Parquet source format.
    
      // Instantiate clients
      const bigqueryClient = new BigQuery();
      const storageClient = new Storage();
    
      // Configure the load job. For full list of options, see:
      // https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs#configuration.load
      const metadata = {
        sourceFormat: 'PARQUET',
        location: 'US',
      };
    
      // Load data from a Google Cloud Storage file into the table
      const [job] = await bigqueryClient
        .dataset(datasetId)
        .table(tableId)
        .load(storageClient.bucket(bucketName).file(filename), metadata);
    
      // load() waits for the job to finish
      console.log(`Job ${job.id} completed.`);
    
      // Check the job's status for errors
      const errors = job.status.errors;
      if (errors && errors.length > 0) {
        throw errors;
      }
    }
    loadTableGCSParquet();

    PHP

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

    use Google\Cloud\BigQuery\BigQueryClient;
    use Google\Cloud\Core\ExponentialBackoff;
    
    /** Uncomment and populate these variables in your code */
    // $projectId  = 'The Google project ID';
    // $datasetId  = 'The BigQuery dataset ID';
    
    // instantiate the bigquery table service
    $bigQuery = new BigQueryClient([
        'projectId' => $projectId,
    ]);
    $dataset = $bigQuery->dataset($datasetId);
    $table = $dataset->table('us_states');
    
    // create the import job
    $gcsUri = 'gs://cloud-samples-data/bigquery/us-states/us-states.parquet';
    $loadConfig = $table->loadFromStorage($gcsUri)->sourceFormat('PARQUET');
    $job = $table->runJob($loadConfig);
    // poll the job until it is complete
    $backoff = new ExponentialBackoff(10);
    $backoff->execute(function () use ($job) {
        print('Waiting for job to complete' . PHP_EOL);
        $job->reload();
        if (!$job->isComplete()) {
            throw new Exception('Job has not yet completed', 500);
        }
    });
    // check if the job has errors
    if (isset($job->info()['status']['errorResult'])) {
        $error = $job->info()['status']['errorResult']['message'];
        printf('Error running job: %s' . PHP_EOL, $error);
    } else {
        print('Data imported successfully' . PHP_EOL);
    }

    Python

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

    Client.load_table_from_uri() メソッドを使用して、Cloud Storage から読み込みジョブを開始します。Parquet を使用するには、LoadJobConfig.source_format プロパティを SourceFormat 定数 PARQUET に設定し、ジョブ構成を load_table_from_uri() メソッドの job_config 引数として渡します。

    # 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.PARQUET
    uri = "gs://cloud-samples-data/bigquery/us-states/us-states.parquet"
    
    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))

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

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

    Console および従来の BigQuery ウェブ UI では、[Write preference] オプションを使用して、ソースファイルまたはクエリ結果からデータを読み込むときに行う操作を指定します。

    追加のデータをテーブルに読み込む場合、以下のオプションがあります。

    Console のオプション 従来の 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 テーブルのデータの上書きを選択できます。

    Console

    1. GCP Console で BigQuery ウェブ UI を開きます。
      BigQuery ウェブ UI に移動

    2. ナビゲーション パネルの [リソース] セクションでプロジェクトを展開し、データセットを選択します。

    3. ウィンドウの右側の詳細パネルで、[テーブルを作成] をクリックします。データを読み込むプロセスは、空のテーブルを作成するプロセスと同じです。

      テーブルを作成

    4. [テーブルの作成] ページの [ソース] セクションで、次の操作を行います。

      • [テーブルの作成元] で、希望するソースタイプを選択します。

        テーブルソースを作成

      • ソース フィールドで、ファイル / Cloud Storage バケットを参照するか、Cloud Storage URI を入力します。BigQuery ウェブ UI では URI の複数指定はできませんが、ワイルドカードはサポートされています。Cloud Storage バケットは、作成するテーブルを含むデータセットと同じロケーションに存在している必要があります。

        ファイルを選択

      • [ファイル形式] で、[Parquet] を選択します。

    5. [テーブルを作成] ページの [送信先] セクションで、次の操作を行います。

      • [データセット名] で、該当するデータセットを選択します。

        データセットを選択

      • [テーブル名] フィールドに、BigQuery で作成するテーブルの名前を入力します。

      • [テーブルタイプ] が [ネイティブ テーブル] に設定されていることを確認します。

    6. [スキーマ] セクションにスキーマ定義を入力します。

      • スキーマ情報を手動で入力するには、次の方法があります。

        • [テキストとして編集] を有効にし、テーブル スキーマを JSON 配列として入力します。

        • [フィールドを追加] を使用して、スキーマを手動で入力します。

    7. [詳細オプション] セクションの [書き込み設定] で、[空の場合に書き込む]、[テーブルに追加する]、または [テーブルを上書きする] を選択します。

      テーブルを上書きする

    8. [テーブルを作成] をクリックします。

    従来の UI

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

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

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

      • [Location] で [Cloud Storage] を選択し、ソース フィールドに Cloud Storage URI を入力します。UI では URI の複数指定はできませんが、ワイルドカードはサポートされています。Cloud Storage バケットは、データを追加または上書きするテーブルを含むデータセットと同じ場所に存在している必要があります。
      • [File format] で、[Parquet] を選択します。
    4. [Create Table] ページの [Destination Table] セクションで、次の操作を行います。

      • [Table name] で適切なデータセットを選択し、追加または上書きするテーブルの名前をテーブル名のフィールドに入力します。
      • [Table type] が [Native table] に設定されていることを確認します。
    5. [Schema] セクションでは、何もする必要はありません。スキーマ情報は、Parquet ファイルで自己記述されます。

    6. [Options] セクションの [Write preference] で、[Write if empty]、[Append to table]、または [Overwrite table] を選択します。

      追加フィールドを使用してスキーマを追加する

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

    コマンドライン

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

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

    ここで

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

    例:

    • 次のコマンドは、gs://mybucket/mydata.parquet からデータを読み込んで mydataset 内の mytable というテーブルを上書きします。mybucketmydataset は、US マルチリージョン ロケーションに存在します。

      bq --location=US load --replace --source_format=PARQUET mydataset.mytable gs://mybucket/mydata.parquet
      
    • 次のコマンドは、gs://mybucket/mydata.parquet からデータを読み込んで mydataset 内の mytable というテーブルに追加します。mybucketmydataset は、asia-northeast1 リージョンに存在します。

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

    API

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

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

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

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

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

    5. configuration.load.writeDisposition プロパティを WRITE_TRUNCATEWRITE_APPENDWRITE_EMPTY のいずれかに設定して、書き込み設定を指定します。

    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.parquet")
    gcsRef.SourceFormat = bigquery.Parquet
    gcsRef.AutoDetect = true
    loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(gcsRef)
    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())
    }

    Node.js

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

    // Import the Google Cloud client libraries
    const {BigQuery} = require('@google-cloud/bigquery');
    const {Storage} = require('@google-cloud/storage');
    
    /**
     * TODO(developer): Uncomment the following lines before running the sample.
     */
    // const datasetId = "my_dataset";
    // const tableId = "my_table";
    
    /**
     * This sample loads the CSV file at
     * https://storage.googleapis.com/cloud-samples-data/bigquery/us-states/us-states.csv
     *
     * TODO(developer): Replace the following lines with the path to your file.
     */
    const bucketName = 'cloud-samples-data';
    const filename = 'bigquery/us-states/us-states.parquet';
    
    async function loadParquetFromGCSTruncate() {
      /**
       * Imports a GCS file into a table and overwrites
       * table data if table already exists.
       */
    
      // Instantiate clients
      const bigqueryClient = new BigQuery();
      const storageClient = new Storage();
    
      // Configure the load job. For full list of options, see:
      // https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs#configuration.load
      const metadata = {
        sourceFormat: 'PARQUET',
        // Set the write disposition to overwrite existing table data.
        writeDisposition: 'WRITE_TRUNCATE',
        location: 'US',
      };
    
      // Load data from a Google Cloud Storage file into the table
      const [job] = await bigqueryClient
        .dataset(datasetId)
        .table(tableId)
        .load(storageClient.bucket(bucketName).file(filename), metadata);
      // load() waits for the job to finish
      console.log(`Job ${job.id} completed.`);
    
      // Check the job's status for errors
      const errors = job.status.errors;
      if (errors && errors.length > 0) {
        throw errors;
      }
    }
    loadParquetFromGCSTruncate();

    PHP

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

    use Google\Cloud\BigQuery\BigQueryClient;
    use Google\Cloud\Core\ExponentialBackoff;
    
    /** Uncomment and populate these variables in your code */
    // $projectId = 'The Google project ID';
    // $datasetId = 'The BigQuery dataset ID';
    // $tableID = 'The BigQuery table ID';
    
    // instantiate the bigquery table service
    $bigQuery = new BigQueryClient([
        'projectId' => $projectId,
    ]);
    $table = $bigQuery->dataset($datasetId)->table($tableId);
    
    // create the import job
    $gcsUri = 'gs://cloud-samples-data/bigquery/us-states/us-states.parquet';
    $loadConfig = $table->loadFromStorage($gcsUri)->sourceFormat('PARQUET')->writeDisposition('WRITE_TRUNCATE');
    $job = $table->runJob($loadConfig);
    
    // poll the job until it is complete
    $backoff = new ExponentialBackoff(10);
    $backoff->execute(function () use ($job) {
        print('Waiting for job to complete' . PHP_EOL);
        $job->reload();
        if (!$job->isComplete()) {
            throw new Exception('Job has not yet completed', 500);
        }
    });
    
    // check if the job has errors
    if (isset($job->info()['status']['errorResult'])) {
        $error = $job->info()['status']['errorResult']['message'];
        printf('Error running job: %s' . PHP_EOL, $error);
    } else {
        print('Data imported successfully' . PHP_EOL);
    }

    Python

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

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

    # from google.cloud import bigquery
    # client = bigquery.Client()
    # table_ref = client.dataset('my_dataset').table('existing_table')
    
    job_config = bigquery.LoadJobConfig()
    job_config.write_disposition = bigquery.WriteDisposition.WRITE_TRUNCATE
    job_config.source_format = bigquery.SourceFormat.PARQUET
    uri = "gs://cloud-samples-data/bigquery/us-states/us-states.parquet"
    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))

    Parquet の変換

    BigQuery は、次のように Parquet のデータ型を BigQuery のデータ型に変換します。

    型変換

    Parquet の型 Parquet の変換される型 BigQuery のデータ型
    BOOLEAN NONE ブール値
    INT32 NONE、UINT_8、UINT_16、UINT_32、INT_8、INT_16、INT_32 整数
    INT32 DECIMAL(DECIMAL アノテーションを参照) 数値
    INT32 DATE 日付
    INT64 NONE、UINT_64、INT_64 整数
    INT64 DECIMAL(DECIMAL アノテーションを参照) 数値
    INT64 TIMESTAMP_MILLIS タイムスタンプ
    INT64 TIMESTAMP_MICROS タイムスタンプ
    INT96 NONE タイムスタンプ
    FLOAT NONE 浮動小数点数
    DOUBLE NONE 浮動小数点数
    BYTE_ARRAY NONE バイト
    BYTE_ARRAY UTF8 文字列
    FIXED_LEN_BYTE_ARRAY DECIMAL(DECIMAL アノテーションを参照) 数値
    FIXED_LEN_BYTE_ARRAY NONE バイト

    Parquet の型と変換される型の上記以外の組み合わせはサポートされていません。

    Decimal アノテーション

    DECIMAL アノテーションを持つ Parquet 型の場合、precision の最大数は 38(合計桁数)、scale の最大数は 9(小数点以下の桁数)です。整数の桁数は precision から scale を引いた数であるため、最大で 29 になります。たとえば DECIMAL(38, 9) は、precision が 38 であり、scale が 9 であるためサポートされます。この例では、整数の桁数は 29 です。DECIMAL(38, 5) は precision が 38 で、scale が 5 であるため、サポートされません。この例では、整数の桁数は 33 です。

    列名の変換

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

    • _TABLE_
    • _FILE_
    • _PARTITION

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

    現時点では、列名にピリオド(.)を持つ列を含む Parquet ファイルを読み込むことはできません。

    Parquet の列名に他の文字(ピリオド以外)が含まれている場合、その文字はアンダースコアに置き換えられます。競合を避けるために、列名の末尾にアンダースコアを追加できます。たとえば、Parquet ファイルに Column1column1 の 2 つの列が含まれている場合、それらの列はそれぞれ Column1column1_ として読み込まれます。

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

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

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