从 Cloud Storage 加载 JSON 数据

您可以将以换行符分隔的 JSON (ndJSON) 数据从 Cloud Storage 加载到新的表或分区中,也可以将其附加到现有的表或分区或覆盖现有的表或分区。在您的数据加载到 BigQuery 后,系统会将其转换为适用于 Capacitor 的列式格式(BigQuery 的存储格式)。

如需将 Cloud Storage 中的数据加载到 BigQuery 表,则包含该表的数据集必须与相应 Cloud Storage 存储桶位于同一区域或多区域位置。

ndJSON 格式与 JSON 行格式相同。

限制

将数据从 Cloud Storage 存储桶加载到 BigQuery 时,需要遵循以下限制:

  • BigQuery 不保证外部数据源的数据一致性。在查询运行的过程中,底层数据的更改可能会导致意外行为。
  • BigQuery 不支持 Cloud Storage 对象版本控制。如果您在 Cloud Storage URI 中添加了世代编号,则加载作业将失败。

将 JSON 文件加载到 BigQuery 时,请注意以下事项:

  • JSON 数据必须以换行符分隔,或为 ndJSON。在文件中,每个 JSON 对象都必须单独列为一行。
  • 如果使用 gzip 压缩,BigQuery 将无法并行读取数据。与加载未压缩数据相比,将压缩的 JSON 数据加载到 BigQuery 的速度较为缓慢。
  • 您无法在同一个加载作业中同时包含压缩文件和未压缩文件。
  • gzip 文件的大小上限为 4 GB。
  • 即使提取时的架构信息未知,BigQuery 也支持 JSON 类型。声明为 JSON 类型的字段会加载原始 JSON 值。

  • 如果您使用 BigQuery API 将 [-253+1, 253-1] 范围之外的整数(通常意味着大于 9,007,199,254,740,991)加载到为整数 (INT64) 列,请将其作为字符串传递,以避免数据损坏。此问题是由 JSON 或 ECMAScript 中的整数大小限制引起的。如需了解详情,请参阅 RFC 7159 的“数字”部分

  • 加载 CSV 或 JSON 数据时,DATE 列的值必须使用英文短划线 (-) 分隔符,并且日期必须采用以下格式:YYYY-MM-DD(年-月-日)。
  • 加载 JSON 或 CSV 数据时,TIMESTAMP 列中的值必须在时间戳的日期部分使用短划线 (-) 或斜杠 (/) 分隔符,并且日期必须采用以下格式之一:YYYY-MM-DD(年-月-日)或 YYYY/MM/DD(年/月/日)。时间戳的 hh:mm:ss(时-分-秒)部分必须使用英文冒号 (:) 分隔符。
  • 您的文件必须符合加载作业限制中所述的 JSON 文件大小限制。

准备工作

授予为用户提供执行本文档中的每个任务所需权限的 Identity and Access Management (IAM) 角色,并创建一个数据集来存储您的数据。

所需权限

如需将数据加载到 BigQuery,您需要拥有 IAM 权限才能运行加载作业以及将数据加载到 BigQuery 表和分区中。如果要从 Cloud Storage 加载数据,您还需要拥有访问包含数据的存储桶的 IAM 权限。

将数据加载到 BigQuery 的权限

如需将数据加载到新的 BigQuery 表或分区中,或者附加或覆盖现有的表或分区,您需要拥有以下 IAM 权限:

  • bigquery.tables.create
  • bigquery.tables.updateData
  • bigquery.tables.update
  • bigquery.jobs.create

以下预定义 IAM 角色都具有将数据加载到 BigQuery 表或分区所需的权限:

  • roles/bigquery.dataEditor
  • roles/bigquery.dataOwner
  • roles/bigquery.admin(包括 bigquery.jobs.create 权限)
  • bigquery.user(包括 bigquery.jobs.create 权限)
  • bigquery.jobUser(包括 bigquery.jobs.create 权限)

此外,如果您拥有 bigquery.datasets.create 权限,则可以在自己创建的数据集中使用加载作业创建和更新表。

如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅预定义的角色和权限

从 Cloud Storage 加载数据的权限

如需获得从 Cloud Storage 存储桶加载数据所需的权限,请让您的管理员为您授予存储桶的 Storage Admin (roles/storage.admin) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

此预定义角色可提供从 Cloud Storage 存储桶加载数据所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

如需从 Cloud Storage 存储桶加载数据,您需要具备以下权限:

  • storage.buckets.get
  • storage.objects.get
  • storage.objects.list (required if you are using a URI wildcard)

您也可以使用自定义角色或其他预定义角色来获取这些权限。

创建数据集

创建 BigQuery 数据集来存储数据。

JSON 压缩

您可以使用 gzip 实用程序来压缩 JSON 文件。请注意,gzip 执行完整的文件压缩,这与压缩编解码器对其他文件格式(例如 Avro)执行的文件内容压缩不同。使用 gzip 压缩 JSON 文件可能会对性能产生影响:如需详细权衡利弊,请参阅加载经过压缩和未经压缩的数据

将 JSON 数据加载到新表

如需将 JSON 数据从 Cloud Storage 加载到新的 BigQuery 表中,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在左侧窗格中,点击 探索器
  3. 探索器窗格中,展开您的项目,点击数据集,然后选择一个数据集。
  4. 数据集信息部分中,点击 创建表
  5. 创建表窗格中,指定以下详细信息:
    1. 来源部分中,从基于以下数据源创建表列表中选择 Google Cloud Storage。之后,执行以下操作:
      1. 从 Cloud Storage 存储桶中选择一个文件,或输入 Cloud Storage URI。您无法在 Google Cloud 控制台中添加多个 URI,但支持使用通配符。Cloud Storage 存储桶必须与您要创建、附加或覆盖的表所属的数据集位于同一位置。 选择源文件以创建 BigQuery 表
      2. 文件格式部分,选择 JSONL(以换行符分隔的 JSON)
    2. 目标部分,指定以下详细信息:
      1. 数据集部分,选择您要在其中创建表的数据集。
      2. 字段中,输入您要创建的表的名称。
      3. 确认表类型字段是否设置为原生表
    3. 架构部分,输入架构定义。如需启用对架构的自动检测,请选择自动检测。 您可以使用以下任一方法手动输入架构信息:
      • 选项 1:点击以文本形式修改,并以 JSON 数组的形式粘贴架构。使用 JSON 数组时,您要使用与创建 JSON 架构文件相同的流程生成架构。您可以输入以下命令,以 JSON 格式查看现有表的架构:
            bq show --format=prettyjson dataset.table
            
      • 选项 2:点击 添加字段,然后输入表架构。指定每个字段的名称类型模式
    4. 可选:指定分区和聚簇设置。如需了解详情,请参阅创建分区表创建和使用聚簇表
    5. 点击高级选项,然后执行以下操作:
      • 写入偏好设置部分,选中只写入空白表。此选项创建一个新表并向其中加载数据。
      • 允许的错误数部分中,接受默认值 0 或输入可忽略的含错行数上限。如果包含错误的行数超过此值,该作业将生成 invalid 消息并失败。此选项仅适用于 CSV 和 JSON 文件。
      • 对于时区,请输入在解析没有特定时区的时间戳值时将应用的默认时区。请点击此处,查看更多有效的时区名称。如果未提供此值,则系统会使用默认时区 UTC 解析没有特定时区的时间戳值。 (预览版)。
      • 对于日期格式,请输入格式元素,以定义输入文件中 DATE 值的格式设置方式。此字段应采用 SQL 样式格式(例如 MM/DD/YYYY)。如果提供了此值,则此格式是唯一兼容的 DATE 格式。 架构自动检测也会根据此格式(而非现有格式)决定 DATE 列类型。如果不存在此值,则系统会使用默认格式解析 DATE 字段。(预览版)。
      • 对于日期时间格式,请输入格式元素,以定义输入文件中 DATETIME 值的格式设置方式。 此字段应采用 SQL 样式格式(例如,MM/DD/YYYY HH24:MI:SS.FF3)。如果存在此值,则此格式是唯一兼容的 DATETIME 格式。 架构自动检测也会根据此格式(而非现有格式)决定 DATETIME 列类型。如果不存在此值,则系统会使用默认格式解析 DATETIME 字段。 (预览版)。
      • 对于时间格式,请输入格式元素,以定义输入文件中 TIME 值的格式设置方式。此字段应采用 SQL 样式格式(例如 HH24:MI:SS.FF3)。如果提供了此值,则此格式是唯一兼容的 TIME 格式。 架构自动检测也会根据此格式(而非现有格式)决定 TIME 列类型。如果不存在此值,则系统会使用默认格式解析 TIME 字段。 (预览版)。
      • 对于时间戳格式,请输入格式元素,以定义输入文件中 TIMESTAMP 值的格式设置方式。 此字段应采用 SQL 样式格式(例如,MM/DD/YYYY HH24:MI:SS.FF3)。如果存在此值,则此格式是唯一兼容的 TIMESTAMP 格式。 架构自动检测也会根据此格式(而非现有格式)决定 TIMESTAMP 列类型。如果不存在此值,则系统会使用默认格式解析 TIMESTAMP 字段。(预览版)。
      • 如果要忽略表架构中不存在的行中的值,请选择未知值
      • 加密部分,点击客户管理的密钥,以使用 Cloud Key Management Service 密钥。如果保留 Google-managed key 设置,BigQuery 将对静态数据进行加密
    6. 点击创建表

SQL

使用 LOAD DATA DDL 语句. 以下示例会将 JSON 文件加载到新表 mytable 中:

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    LOAD DATA OVERWRITE mydataset.mytable
    (x INT64,y STRING)
    FROM FILES (
      format = 'JSON',
      uris = ['gs://bucket/path/file.json']);

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

bq

使用 bq load 命令,通过 --source_format 标志指定 NEWLINE_DELIMITED_JSON,并添加 Cloud Storage URI。您可以添加单个 URI、以英文逗号分隔的 URI 列表或含有通配符的 URI。在架构定义文件中以内嵌形式提供架构,或者使用架构自动检测功能。

(可选)提供 --location 标志并将其值设置为您的位置

其他可选标志包括:

  • --max_bad_records:此标志值为一个整数,指定了作业中允许的错误记录数上限,超过此数量之后,整个作业就会失败。默认值为 0。无论 --max_bad_records 值设为多少,系统最多只会返回 5 个任意类型的错误。
  • --ignore_unknown_values:如果指定此标志,系统会允许并忽略 CSV 或 JSON 数据中无法识别的额外值。
  • --time_zone:(预览版)可选的默认时区,在解析 CSV 或 JSON 数据中没有特定时区的时间戳值时应用。
  • --date_format:(预览版)可选的自定义字符串,用于定义 CSV 或 JSON 数据中 DATE 值的格式设置方式。
  • --datetime_format:(预览版)可选的自定义字符串,用于定义 CSV 或 JSON 数据中 DATETIME 值的格式设置方式。
  • --time_format:(预览版)可选的自定义字符串,用于定义 CSV 或 JSON 数据中 TIME 值的格式设置方式。
  • --timestamp_format:(预览版)可选的自定义字符串,用于定义 CSV 或 JSON 数据中 TIMESTAMP 值的格式设置方式。
  • --autodetect:如果指定此标志,系统会为 CSV 和 JSON 数据启用架构自动检测功能。
  • --time_partitioning_type:此标志会在表上启用基于时间的分区,并设置分区类型。可能的值包括 HOURDAYMONTHYEAR。当您创建按 DATEDATETIMETIMESTAMP 列分区的表时,可选用此标志。基于时间的分区的默认分区类型为 DAY。 您无法更改现有表上的分区规范。
  • --time_partitioning_expiration:此标志值为一个整数,指定了应在何时删除基于时间的分区(以秒为单位)。过期时间以分区的世界协调时间 (UTC) 日期加上这个整数值为准。
  • --time_partitioning_field:此标志表示用于创建分区表的 DATETIMESTAMP 列。如果在未提供此值的情况下启用了基于时间的分区,系统会创建注入时间分区表。
  • --require_partition_filter:启用后,此选项会要求用户添加 WHERE 子句来指定要查询的分区。要求使用分区过滤条件可以减少费用并提高性能。如需了解详情,请参阅要求在查询中使用分区过滤器
  • --clustering_fields:此标志表示以英文逗号分隔的列名称列表(最多包含 4 个列名称),用于创建聚簇表
  • --destination_kms_key:用于加密表数据的 Cloud KMS 密钥。

    如需详细了解分区表,请参阅:

    如需详细了解聚簇表,请参阅:

    如需详细了解表加密,请参阅以下部分:

如需将 JSON 数据加载到 BigQuery,请输入以下命令:

bq --location=LOCATION load \
--source_format=FORMAT \
DATASET.TABLE \
PATH_TO_SOURCE \
SCHEMA

请替换以下内容:

  • LOCATION:您所在的位置。--location 是可选标志。例如,如果您在东京区域使用 BigQuery,可将该标志的值设置为 asia-northeast1。您可以使用 .bigqueryrc 文件设置位置的默认值。
  • FORMATNEWLINE_DELIMITED_JSON
  • DATASET:现有数据集。
  • TABLE:要向其中加载数据的表的名称。
  • PATH_TO_SOURCE 是完全限定的 Cloud Storage URI 或以英文逗号分隔的 URI 列表。系统也支持使用通配符
  • SCHEMA:有效架构。该架构可以是本地 JSON 文件,也可以在命令中以内嵌形式输入架构。如果您使用架构文件,请勿为其提供扩展名。您还可以改用 --autodetect 标志,而无需提供架构定义。

示例:

以下命令将 gs://mybucket/mydata.json 中的数据加载到 mydataset 中名为 mytable 的表中。架构是在名为 myschema 的本地架构文件中定义的。

    bq load \
    --source_format=NEWLINE_DELIMITED_JSON \
    mydataset.mytable \
    gs://mybucket/mydata.json \
    ./myschema

以下命令将 gs://mybucket/mydata.json 中的数据加载到 mydataset 中名为 mytable 的新注入时间分区表。架构是在名为 myschema 的本地架构文件中定义的。

    bq load \
    --source_format=NEWLINE_DELIMITED_JSON \
    --time_partitioning_type=DAY \
    mydataset.mytable \
    gs://