从 Cloud Storage 加载 Parquet 数据

本页面概述了如何将 Cloud Storage 中的 Parquet 数据加载到 BigQuery 中。

Parquet 是一种面向列的开放源代码数据存储格式,广泛用于 Apache Hadoop 生态系统中。

从 Cloud Storage 加载 Parquet 数据时,可以将数据加载到新的表或分区中,也可以将其附加到或覆盖现有的表或分区。当数据加载到 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 数据类型,使它们与 BigQuery SQL 语法兼容。如需了解详情,请参阅 Parquet 转换

Parquet 压缩

系统不支持压缩的 Parquet 文件,但支持压缩的数据块。BigQuery 支持将 Snappy、GZip 和 LZO_1X 编解码器用于 Parquet 文件中的压缩数据块。

将 Parquet 数据加载到新表

要将 Cloud Storage 中的 Parquet 数据加载到新的 BigQuery 表中,或将数据附加到现有表中,请执行以下操作:

Console

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 BigQuery 网页界面

  2. 在导航面板的资源部分中,展开您的项目并选择数据集。

  3. 在窗口右侧的详细信息面板中,点击创建表。加载数据的过程与创建空表的过程相同。

    创建表

  4. 创建表页面的来源部分,执行以下操作:

    • 基于以下数据创建表部分,选择所需的来源类型。

      创建表来源

    • 在来源字段中,浏览并找到相应的文件/Cloud Storage 存储分区,或输入 Cloud Storage URI。请注意,BigQuery 网页界面不支持添加多个 URI,但支持使用通配符。Cloud Storage 存储分区必须与您要创建的表所属的数据集位于同一位置。

      选择文件

    • 文件格式部分,选择 Parquet

  5. 创建表格页面的目标位置部分,执行以下操作:

    • 数据集名称部分,选择适当的数据集。

      查看数据集

    • 表名称字段中,输入您要在 BigQuery 中创建的表的名称。

    • 验证表类型是否设置为原生表

  6. Schema 部分中,无需执行任何操作。架构在 Parquet 文件中为自描述形式。

  7. 高级选项部分中选择适用项,然后点击创建表

经典版界面

  • 转到 BigQuery Web 界面。
    转到 BigQuery 网页界面

  • 在导航面板中,将鼠标悬停在数据集上,点击向下箭头图标 向下箭头图标图片,然后点击 Create new table。加载数据的过程与创建空表的过程相同。

  • Create Table 页面的 Source Data 部分,执行以下操作:

    • Location 部分选择 Cloud Storage,然后在来源字段中输入 Cloud Storage URI。请注意,BigQuery 网页界面不支持添加多个 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/ 中多个文件的数据加载到 mydataset 中名为 mytable 的表中。Cloud Storage URI 使用通配符。 mybucketmydataset 创建于 US 多区域位置。

      bq --location=US load --source_format=PARQUET mydataset.mytable gs://mybucket/mydata*.parquet
      
    • 以下命令将 gs://mybucket/ 中多个文件的数据加载到 mydataset 中名为 mytable 的表中。该命令包含 Cloud Storage URI(带有通配符)的英文逗号分隔列表。mybucketmydataset 创建于 asia-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 都可以包含一个“*”通配符

    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,并将其作为 jobs.insert() 传递。此方法比较不会受到网络故障的影响,因为客户端可以对已知的作业 ID 进行轮询或重试。

    • 对指定的作业 ID 调用 jobs.insert() 具有幂等性,即,您可以对同一作业 ID 进行无限次重试,但最多只会有一个成功操作。

    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,并将作业配置作为 job_config 参数传递给 load_table_from_uri() 方法。

    # 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 数据覆盖表

    您可以从源文件或通过附加查询结果将其他数据加载到表中。

    在控制台或经典版 BigQuery 网页界面中,使用 Write preference 选项指定从源文件或查询结果加载数据时要执行的操作。

    将其他数据加载到表中时,可选择以下选项:

    控制台选项 传统版界面选项 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 网页界面。
      转到 BigQuery 网页界面

    2. 在导航面板的资源部分中,展开您的项目并选择数据集。

    3. 在窗口右侧的详细信息面板中,点击创建表。加载数据的过程与创建空表的过程相同。

      创建表

    4. 创建表页面的来源部分,执行以下操作:

      • 基于以下数据创建表部分,选择所需的来源类型。

        创建表来源

      • 在来源字段中,浏览并找到相应的文件/Cloud Storage 存储分区,或输入 Cloud Storage URI。请注意,BigQuery 网页界面不支持添加多个 URI,但支持使用通配符。Cloud Storage 存储分区必须与您要创建的表所属的数据集位于同一位置。

        选择文件

      • 文件格式部分,选择 Parquet

    5. 创建表格页面的目标位置部分,执行以下操作:

      • 数据集名称部分,选择适当的数据集。

        选择数据集

      • 表名称字段中,输入您要在 BigQuery 中创建的表的名称。

      • 验证表类型是否设置为原生表

    6. 架构部分中,输入架构定义。

      • 通过以下方式,手动输入架构信息:

        • 启用以文本形式修改,并以 JSON 数组格式输入表架构。

        • 使用添加字段手动输入架构。

    7. 高级选项部分,为写入偏好设置选择只写入空白表附加到表覆盖表

      覆盖表

    8. 点击创建表

    经典版界面

    1. 转到 BigQuery 网页界面。
      转到 BigQuery 网页界面

    2. 在导航面板中,将鼠标悬停在数据集上,点击向下箭头图标 向下箭头图标图片,然后点击 Create new table。加载数据的过程与创建空表的过程相同。

    3. Create Table 页面的 Source Data 部分,执行以下操作:

      • Location 部分选择 Cloud Storage,然后在来源字段中输入 Cloud Storage URI。请注意,此界面不支持添加多个 URI,但支持使用通配符。Cloud Storage 存储分区必须与您要向其中附加数据或覆盖其数据的表所属的数据集位于同一位置。
      • File format 部分,选择 Parquet
    4. Create Table 页面的 Destination Table 部分,执行以下操作:

      • Table name 部分,选择适当的数据集,然后在表名称字段中输入您要向其中附加数据或覆盖其数据的表的名称。
      • 验证 Table type 是否设为 Native table
    5. Schema 部分中,无需执行任何操作。架构信息在 Parquet 文件中为自描述形式。

    6. 对于写入偏好设置,请在选项部分选择只写入空白表附加到表覆盖表

      使用“添加”字段添加架构

    7. 点击 Create Table

    命令行

    输入带 bq load 标志的 --replace 命令以覆盖表。提供 --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 类型的精度最高为 38 位(总位数),标度最多可以有 9 位(即小数点右边的数字)。整数位数(即精度减去标度)最多可以是 29。例如,系统支持 DECIMAL(38, 9),因为精度是 38,标度是 9。在这个例子中,整数位数是 29。系统不支持 DECIMAL(38, 5),因为它的精度是 38,标度是 5。在本例中,整数位数是 33。

    列名称转换

    列名称只能包含字母(a-z、A-Z),数字 (0-9) 或下划线 (_),并且必须以字母或下划线开头。列名长度不得超过 128 个字符。列名不能使用以下任何前缀:

    • _TABLE_
    • _FILE_
    • _PARTITION

    列名不可重复,即使其大小写不同也不行。例如,系统会认为名为 Column1 的列与名为 column1 的列相同。

    目前,如果 Parquet 文件中的某些列名称中包含英文句点 (.),则您不能加载此文件。

    如果 Parquet 列名称包含其他字符(英文句点除外),系统会用下划线替换这些字符。此外,系统还可能在列名称末尾处添加下划线,以避免冲突。例如,如果一个 Parquet 文件包含 Column1column1 这两列,那么系统会将这些列分别加载为 Column1column1_

    此页内容是否有用?请给出您的反馈和评价:

    发送以下问题的反馈:

    此网页
    需要帮助?请访问我们的支持页面