从 Cloud Storage 加载 JSON 数据
您可以将以换行符分隔的 JSON (ndJSON) 数据从 Cloud Storage 加载到新的表或分区中,也可以将其附加到现有的表或分区或覆盖现有的表或分区。在您的数据加载到 BigQuery 后,系统会将其转换为适用于 Capacitor 的列式格式(BigQuery 的存储格式)。
如需将 Cloud Storage 中的数据加载到 BigQuery 表,则包含该表的数据集必须与相应 Cloud Storage 存储分区位于同一区域或多区域位置。
ndJSON 格式与 JSON Lines 格式相同。
限制
将数据从 Cloud Storage 存储桶加载到 BigQuery 时,需要遵循以下限制:
- 如果您的数据集位置设置为
US
多区域以外的值,则 Cloud Storage 存储桶必须与数据集位于同一单区域中或包含在同一多区域内。 - 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 表中,请执行以下操作:
控制台
在 Google Cloud 控制台中,转到 BigQuery 页面。
- 在浏览器窗格中,展开您的项目,然后选择数据集。
- 在数据集信息部分中,点击 创建表。
- 在创建表面板中,指定以下详细信息:
- 在来源部分中,从基于以下数据源创建表列表中选择 Google Cloud Storage。之后,执行以下操作:
- 从 Cloud Storage 存储桶中选择一个文件,或输入 Cloud Storage URI。您无法在 Google Cloud 控制台中添加多个 URI,但支持使用通配符。Cloud Storage 存储桶必须与您要创建、附加或覆盖的表所属的数据集位于同一位置。
- 在文件格式部分,选择 JSONL(以换行符分隔的 JSON)。
- 在目标部分,指定以下详细信息:
- 在数据集部分,选择您要在其中创建表的数据集。
- 在表字段中,输入您要创建的表的名称。
- 确认表类型字段是否设置为原生表。
- 在架构部分,输入架构定义。如需启用对架构的自动检测,请选择自动检测。
您可以使用以下任一方法手动输入架构信息:
- 选项 1:点击以文本形式修改,并以 JSON 数组的形式粘贴架构。使用 JSON 数组时,您要使用与创建 JSON 架构文件相同的流程生成架构。您可以输入以下命令,以 JSON 格式查看现有表的架构:
bq show --format=prettyjson dataset.table
- 选项 2:点击 类型和模式。 添加字段,然后输入表架构。指定每个字段的名称、
- 选项 1:点击以文本形式修改,并以 JSON 数组的形式粘贴架构。使用 JSON 数组时,您要使用与创建 JSON 架构文件相同的流程生成架构。您可以输入以下命令,以 JSON 格式查看现有表的架构:
- 可选:指定分区和聚簇设置。如需了解详情,请参阅创建分区表和创建和使用聚簇表。
- 点击高级选项,然后执行以下操作:
- 在写入偏好设置部分,选中只写入空白表。此选项创建一个新表并向其中加载数据。
- 在允许的错误数部分中,接受默认值
0
或输入可忽略的含错行数上限。如果包含错误的行数超过此值,该作业将生成invalid
消息并失败。此选项仅适用于 CSV 和 JSON 文件。 - 如果要忽略表架构中不存在的行中的值,请选择未知值。
- 在加密部分,点击客户管理的密钥,以使用 Cloud Key Management Service 密钥。如果保留 Google 管理的密钥设置,BigQuery 将对静态数据进行加密。
- 点击创建表。
SQL
使用 LOAD DATA
DDL 语句.
以下示例会将 JSON 文件加载到新表 mytable
中:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,输入以下语句:
LOAD DATA OVERWRITE mydataset.mytable (x INT64,y STRING) FROM FILES ( format = 'JSON', uris = ['gs://bucket/path/file.json']);
点击
运行。
如需详细了解如何运行查询,请参阅运行交互式查询。
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 数据中无法识别的额外值。--autodetect
:如果指定此标志,系统会为 CSV 和 JSON 数据启用架构自动检测功能。--time_partitioning_type
:此标志会在表上启用基于时间的分区,并设置分区类型。可能的值包括HOUR
、DAY
、MONTH
、YEAR
。当您创建按DATE
、DATETIME
或TIMESTAMP
列分区的表时,可选用此标志。基于时间的分区的默认分区类型为DAY
。 您无法更改现有表上的分区规范。--time_partitioning_expiration
:此标志值为一个整数,指定了应在何时删除基于时间的分区(以秒为单位)。过期时间以分区的世界协调时间 (UTC) 日期加上这个整数值为准。--time_partitioning_field
:此标志表示用于创建分区表的DATE
或TIMESTAMP
列。如果在未提供此值的情况下启用了基于时间的分区,系统会创建注入时间分区表。--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 文件设置位置的默认值。FORMAT
:NEWLINE_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://mybucket/mydata.json \
./myschema
以下命令将 gs://mybucket/mydata.json
中的数据加载到 mydataset
中名为 mytable
的分区表中。该表按 mytimestamp
列进行分区。架构是在名为 myschema
的本地架构文件中定义的。
bq load \
--source_format=NEWLINE_DELIMITED_JSON \
--time_partitioning_field mytimestamp \
mydataset.mytable \
gs://mybucket/mydata.json \
./myschema
以下命令将 gs://mybucket/mydata.json
中的数据加载到 mydataset
中名为 mytable
的表中。架构是自动检测的。
bq load \
--autodetect \
--source_format=NEWLINE_DELIMITED_JSON \
mydataset.mytable \
gs://mybucket/mydata.json
以下命令将 gs://mybucket/mydata.json
中的数据加载到 mydataset
中名为 mytable
的表中。架构以内嵌形式定义,格式为:FIELD:DATA_TYPE, FIELD:DATA_TYPE
。
bq load \
--source_format=NEWLINE_DELIMITED_JSON \
mydataset.mytable \
gs://mybucket/mydata.json \
qtr:STRING,sales:FLOAT,year:STRING
以下命令将 gs://mybucket/
中多个文件的数据加载到 mydataset
中名为 mytable
的表中。Cloud Storage URI 使用通配符。架构是自动检测的。
bq load \
--autodetect \
--source_format=NEWLINE_DELIMITED_JSON \
mydataset.mytable \
gs://mybucket/mydata*.json
以下命令将 gs://mybucket/
中多个文件的数据加载到 mydataset
中名为 mytable
的表中。该命令包含以英文逗号分隔的 Cloud Storage URI 列表(含通配符)。架构是在名为 myschema
的本地架构文件中定义的。
bq load \
--source_format=NEWLINE_DELIMITED_JSON \
mydataset.mytable \
"gs://mybucket/00/*.json","gs://mybucket/01/*.json" \
./myschema
API
创建指向 Cloud Storage 中源数据的
load
作业。source URIs
属性必须是完全限定的,格式为gs://BUCKET/OBJECT
。每个 URI 都可以包含一个“*”通配符。将
sourceFormat
属性设置为NEWLINE_DELIMITED_JSON
,以指定JSON
数据格式。如需检查作业状态,请调用
jobs.get(JOB_ID*)
,并将JOB_ID
替换为初始请求返回的作业的 ID。- 如果
status.state = DONE
,则表示作业已成功完成。 - 如果出现
status.errorResult
属性,则表示请求失败,并且该对象将包含描述问题的相关信息。如果请求失败,则不创建任何表且不加载任何数据。 - 如果未出现
status.errorResult
,则表示作业已成功完成,但可能存在一些非严重错误,如导入一些行时出错。非严重错误会列在返回的作业对象的status.errors
属性中。
- 如果
API 说明:
加载作业兼具原子性和一致性。也就是说,如果加载作业失败,则所有数据都不可用;如果加载作业成功,则所有数据全部可用。
通过调用
jobs.insert
来创建加载作业时,最佳做法是生成唯一 ID,并将其作为jobReference.jobId
传递。此方法受网络故障影响较小,因为客户端可以对已知的作业 ID 进行轮询或重试。对指定的作业 ID 调用
jobs.insert
具有幂等性。您可以对同一作业 ID 进行无限次重试,但最多只会有一个成功操作。
C#
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 C# 设置说明进行操作。 如需了解详情,请参阅 BigQuery C# API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
使用BigQueryClient.CreateLoadJob()
方法,启动从 Cloud Storage 加载数据的作业。如需使用 JSONL,请创建一个 CreateLoadJobOptions
对象,并将其 SourceFormat
属性设置为 FileFormat.NewlineDelimitedJson
。
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
使用 LoadJobConfiguration.builder(tableId, sourceUri) 方法启动一个从 Cloud Storage 加载数据的作业。如需使用以换行符分隔的 JSON 文件,请使用 LoadJobConfiguration.setFormatOptions(FormatOptions.json())。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
PHP
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 PHP 设置说明进行操作。 如需了解详情,请参阅 BigQuery PHP API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
使用 Client.load_table_from_uri() 方法启动从 Cloud Storage 加载数据的作业。如需使用 JSONL,请将 LoadJobConfig.source_format 属性设置为字符串NEWLINE_DELIMITED_JSON
,并将作业配置作为 job_config
参数传递给 load_table_from_uri()
方法。
Ruby
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 BigQuery Ruby API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
使用 Dataset.load_job() 方法启动一个从 Cloud Storage 加载数据的作业。如需使用 JSONL,请将format
参数设置为 "json"
。
加载嵌套和重复的 JSON 数据
BigQuery 允许从支持基于对象的架构的各种源格式(如 JSON、Avro、ORC、Parquet、Firestore、Datastore 等)加载嵌套重复数据。
每行必须有一个 JSON 对象,其中包括任何嵌套或重复的字段。
以下显示了嵌套或重复数据的示例。此表包含有关人员的信息。其中包含以下字段:
id
first_name
last_name
dob
(出生日期)addresses
(嵌套和重复的字段)addresses.status
(目前或之前的状态)addresses.address
addresses.city
addresses.state
addresses.zip
addresses.numberOfYears
(在此地址居住的年数)
JSON 数据文件如下所示。请注意,地址字段包含值数组(以 [ ]
表示)。
{"id":"1","first_name":"John","last_name":"Doe","dob":"1968-01-22","addresses":[{"status":"current","address":"123 First Avenue","city":"Seattle","state":"WA","zip":"11111","numberOfYears":"1"},{"status":"previous","address":"456 Main Street","city":"Portland","state":"OR","zip":"22222","numberOfYears":"5"}]} {"id":"2","first_name":"Jane","last_name":"Doe","dob":"1980-10-16","addresses":[{"status":"current","address":"789 Any Avenue","city":"New York","state":"NY","zip":"33333","numberOfYears":"2"},{"status":"previous","address":"321 Main Street","city":"Hoboken","state":"NJ","zip":"44444","numberOfYears":"3"}]}
此表的架构如下所示:
[ { "name": "id", "type": "STRING", "mode": "NULLABLE" }, { "name": "first_name", "type": "STRING", "mode": "NULLABLE" }, { "name": "last_name", "type": "STRING", "mode": "NULLABLE" }, { "name": "dob", "type": "DATE", "mode": "NULLABLE" }, { "name": "addresses", "type": "RECORD", "mode": "REPEATED", "fields": [ { "name": "status", "type": "STRING", "mode": "NULLABLE" }, { "name": "address", "type": "STRING", "mode": "NULLABLE" }, { "name": "city", "type": "STRING", "mode": "NULLABLE" }, { "name": "state", "type": "STRING", "mode": "NULLABLE" }, { "name": "zip", "type": "STRING", "mode": "NULLABLE" }, { "name": "numberOfYears", "type": "STRING", "mode": "NULLABLE" } ] } ]
如需了解如何指定嵌套和重复的架构,请参阅指定嵌套和重复的字段。
加载半结构化 JSON 数据
BigQuery 支持加载半结构化数据,其中字段可以接受不同类型的值。以下示例显示与上述嵌套和重复的 JSON 数据示例类似的数据,但 address
字段可以是 STRING
、STRUCT
或 ARRAY
:
{"id":"1","first_name":"John","last_name":"Doe","dob":"1968-01-22","address":"123 First Avenue, Seattle WA 11111"} {"id":"2","first_name":"Jane","last_name":"Doe","dob":"1980-10-16","address":{"status":"current","address":"789 Any Avenue","city":"New York","state":"NY","zip":"33333","numberOfYears":"2"}} {"id":"3","first_name":"Bob","last_name":"Doe","dob":"1982-01-10","address":[{"status":"current","address":"789 Any Avenue","city":"New York","state":"NY","zip":"33333","numberOfYears":"2"}, "321 Main Street Hoboken NJ 44444"]}
您可以使用以下架构将这些数据加载到 BigQuery 中:
[ { "name": "id", "type": "STRING", "mode": "NULLABLE" }, { "name": "first_name", "type": "STRING", "mode": "NULLABLE" }, { "name": "last_name", "type": "STRING", "mode": "NULLABLE" }, { "name": "dob", "type": "DATE", "mode": "NULLABLE" }, { "name": "address", "type": "JSON", "mode": "NULLABLE" } ]
address
字段会加载到类型为 JSON
的列中,用于保存示例中的混合类型。无论数据是否包含混合类型,您都可以将数据提取为 JSON
。例如,您可以指定 JSON
(而不是 STRING
)作为 first_name
字段的类型。如需了解详情,请参阅在 GoogleSQL 中使用 JSON 数据。
使用 JSON 数据覆盖或附加到表
您可以通过添加来自源文件的数据或附加查询结果,将其他数据加载到表中。
在 Google Cloud 控制台中,使用写入偏好设置选项指定从源文件或查询结果加载数据时要执行的操作。
将其他数据加载到表中时,可选择以下选项:
控制台选项 | bq 工具标志 | BigQuery API 属性 | 说明 |
---|---|---|---|
只写入空白表 | 不支持 | WRITE_EMPTY |
仅当表为空时才写入数据。 |
Append to table | --noreplace 或 --replace=false ;如果未指定 --[no]replace ,则默认为附加 |
WRITE_APPEND |
(默认)在表末尾附加数据。 |
覆盖表 | --replace 或 --replace=true |
WRITE_TRUNCATE |
清空表中所有现有数据然后再写入新数据。 此操作还会删除表架构和行级安全性,并移除所有 Cloud KMS 密钥。 |
如果将数据加载到现有表中,加载作业可以附加数据或覆盖表。
您可以使用以下方式之一对表执行附加或覆盖操作:
- Google Cloud 控制台
- bq 命令行工具的
bq load
命令 - 调用
jobs.insert
API 方法并配置load
作业 - 客户端库
控制台
在 Google Cloud 控制台中,转到 BigQuery 页面。
- 在浏览器窗格中,展开您的项目,然后选择数据集。
- 在数据集信息部分中,点击 创建表。
- 在创建表面板中,指定以下详细信息:
- 在来源部分中,从基于以下数据源创建表列表中选择 Google Cloud Storage。之后,执行以下操作:
- 从 Cloud Storage 存储桶中选择一个文件,或输入 Cloud Storage URI。您无法在 Google Cloud 控制台中添加多个 URI,但支持使用通配符。Cloud Storage 存储桶必须与您要创建、附加或覆盖的表所属的数据集位于同一位置。
- 在文件格式部分,选择 JSONL(以换行符分隔的 JSON)。
- 在目标部分,指定以下详细信息:
- 在数据集部分,选择您要在其中创建表的数据集。
- 在表字段中,输入您要创建的表的名称。
- 确认表类型字段是否设置为原生表。
- 在架构部分,输入架构定义。如需启用对架构的自动检测,请选择自动检测。
您可以使用以下任一方法手动输入架构信息:
- 选项 1:点击以文本形式修改,并以 JSON 数组的形式粘贴架构。使用 JSON 数组时,您要使用与创建 JSON 架构文件相同的流程生成架构。您可以输入以下命令,以 JSON 格式查看现有表的架构:
bq show --format=prettyjson dataset.table
- 选项 2:点击 类型和模式。 添加字段,然后输入表架构。指定每个字段的名称、
- 选项 1:点击以文本形式修改,并以 JSON 数组的形式粘贴架构。使用 JSON 数组时,您要使用与创建 JSON 架构文件相同的流程生成架构。您可以输入以下命令,以 JSON 格式查看现有表的架构:
- 可选:指定分区和聚簇设置。如需了解详情,请参阅创建分区表和创建和使用聚簇表。 您无法通过附加或覆盖表将表转换为分区表或聚簇表。Google Cloud 控制台不支持在加载作业中对分区表或聚簇表执行附加或覆盖操作。
- 点击高级选项,然后执行以下操作:
- 在写入偏好设置部分,选择附加到表或覆盖表。
- 在允许的错误数部分中,接受默认值
0
或输入可忽略的含错行数上限。如果包含错误的行数超过此值,该作业将生成invalid
消息并失败。此选项仅适用于 CSV 和 JSON 文件。 - 如果要忽略表架构中不存在的行中的值,请选择未知值。
- 在加密部分,点击客户管理的密钥,以使用 Cloud Key Management Service 密钥。如果保留 Google 管理的密钥设置,BigQuery 将对静态数据进行加密。
- 点击创建表。
SQL
使用 LOAD DATA
DDL 语句.
以下示例会将 JSON 文件附加到表 mytable
:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,输入以下语句:
LOAD DATA INTO mydataset.mytable FROM FILES ( format = 'JSON', uris = ['gs://bucket/path/file.json']);
点击
运行。
如需详细了解如何运行查询,请参阅运行交互式查询。
bq
使用 bq load
命令,通过 --source_format
标志指定 NEWLINE_DELIMITED_JSON
,并添加 Cloud Storage URI。您可以添加单个 URI、以英文逗号分隔的 URI 列表或含有通配符的 URI。
在架构定义文件中以内嵌形式提供架构,或者使用架构自动检测功能。
指定 --replace
标志可以覆盖表。使用 --noreplace
标志可向表附加数据。如果未指定标志,则默认附加数据。
可以在附加或覆盖表时修改表的架构。如需详细了解加载操作期间支持的架构更改,请参阅修改表架构。
(可选)提供 --location
标志并将其值设置为您的位置。
其他可选标志包括:
--max_bad_records
:此标志值为一个整数,指定了作业中允许的错误记录数上限,超过此数量之后,整个作业就会失败。默认值为0
。无论--max_bad_records
值设为多少,系统最多只会返回 5 个任意类型的错误。--ignore_unknown_values
:如果指定此标志,系统会允许并忽略 CSV 或 JSON 数据中无法识别的额外值。--autodetect
:如果指定此标志,系统会为 CSV 和 JSON 数据启用架构自动检测功能。--destination_kms_key
:此标志表示用于加密表数据的 Cloud KMS 密钥。
bq --location=LOCATION load \ --[no]replace \ --source_format=FORMAT \ DATASET.TABLE \ PATH_TO_SOURCE \ SCHEMA
请替换以下内容:
LOCATION
:您所在的位置。--location
是可选标志。您可以使用 .bigqueryrc 文件设置位置的默认值。FORMAT
:NEWLINE_DELIMITED_JSON
。DATASET
:现有数据集。TABLE
:要向其中加载数据的表的名称。PATH_TO_SOURCE
是完全限定的 Cloud Storage URI 或以英文逗号分隔的 URI 列表。系统也支持使用通配符。SCHEMA
:有效架构。该架构可以是本地 JSON 文件,也可以在命令中以内嵌形式输入架构。您还可以改用--autodetect
标志,而无需提供架构定义。
示例:
以下命令可从 gs://mybucket/mydata.json
加载数据并覆盖 mydataset
数据集中名为 mytable
的表。架构是使用架构自动检测功能定义的。
bq load \
--autodetect \
--replace \
--source_format=NEWLINE_DELIMITED_JSON \
mydataset.mytable \
gs://mybucket/mydata.json
以下命令可从 gs://mybucket/mydata.json
加载数据,并将数据附加到 mydataset
数据集中名为 mytable
的表。架构是使用 JSON 架构文件 myschema
定义的。
bq load \
--noreplace \
--source_format=NEWLINE_DELIMITED_JSON \
mydataset.mytable \
gs://mybucket/mydata.json \
./myschema
API
创建指向 Cloud Storage 中源数据的
load
作业。source URIs
属性必须是完全限定的,格式为gs://BUCKET/OBJECT
。您可以采用英文逗号分隔列表的形式添加多个 URI。通配符也受支持。将
configuration.load.sourceFormat
属性设置为NEWLINE_DELIMITED_JSON
,以指定数据格式。将
configuration.load.writeDisposition
属性设置为WRITE_TRUNCATE
或WRITE_APPEND
,以指定写入偏好设置。
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Java
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
PHP
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 PHP 设置说明进行操作。 如需了解详情,请参阅 BigQuery PHP API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Python
如需替换现有表中的行,请将 LoadJobConfig.write_disposition 属性设置为字符串 WRITE_TRUNCATE
。
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Ruby
如需替换现有表中的行,请将 Table.load_job() 中的 write
参数设置为 "WRITE_TRUNCATE"
。
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 BigQuery Ruby API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
加载 hive 分区 JSON 数据
BigQuery 支持加载存储在 Cloud Storage 中的 Hive 分区 JSON 数据,并将 Hive 分区列作为目标 BigQuery 代管表中的列进行填充。如需了解详情,请参阅加载外部分区数据。
加载 JSON 数据的详细信息
本部分介绍 BigQuery 如何在加载 JSON 数据时解析各种数据类型。
数据类型
Boolean。BigQuery 可以解析以下任意布尔数据对:1 或 0、true 或 false、t 或 f、yes 或 no、y 或 n(均不区分大小写)。架构自动检测功能自动检测上述除 0 和 1 之外的所有值。字节。类型为 BYTES 的列必须采用 Base64 编码。
Date。类型为 DATE 的列必须采用 YYYY-MM-DD
格式。
Datetime。类型为 DATETIME 的列必须采用 YYYY-MM-DD
HH:MM:SS[.SSSSSS]
格式。
地理位置。类型为 GEOGRAPHY 的列必须包含以下格式之一的字符串:
- 已知文本 (WKT)
- 已知二进制文件 (WKB)
- GeoJSON
如果使用 WKB,则值应采用十六进制编码。
以下列表显示了有效数据的示例:
- WKT:
POINT(1 2)
- GeoJSON:
{ "type": "Point", "coordinates": [1, 2] }
- 十六进制编码 WKB:
0101000000feffffffffffef3f0000000000000040
在加载 GEOGRAPHY 数据之前,另请参阅加载地理空间数据。
间隔时间。类型为 INTERVAL 的列必须采用 ISO 8601 格式 PYMDTHMS
,其中:
- P = 此指示符表明该值表示时长。必须始终包含此指示符。
- Y = 年
- M = 月
- D = 日
- T = 此指示符表明持续时间的时间部分。必须始终包含此指示符。
- H = 小时
- M = 分钟
- S = 秒。秒数可以表示为一个整数值,也可以表示为最多六位数的小数值(精确到微秒)。
您可以通过在前面添加短划线 (-) 来指示负值。
以下列表显示了有效数据的示例:
P-10000Y0M-3660000DT-87840000H0M0S
P0Y0M0DT0H0M0.000001S
P10000Y0M3660000DT87840000H0M0S
如需加载 INTERVAL 数据,您必须使用 bq load
命令并使用 --schema
标志来指定架构。无法使用控制台上传 INTERVAL 数据。
时间。类型为 TIME 的列必须采用 HH:MM:SS[.SSSSSS]
格式。
Timestamp。BigQuery 接受各种时间戳格式。时间戳必须包含日期部分和时间部分。
日期部分的格式可以是
YYYY-MM-DD
,也可以是YYYY/MM/DD
。时间戳部分必须采用
HH:MM[:SS[.SSSSSS]]
格式(秒和毫秒是可选的)。日期和时间必须用空格或“T”分隔。
(可选)日期和时间可后跟世界协调时间 (UTC) 偏移量或世界协调时间 (UTC) 可用区指示符 (
Z
)。如需了解详情,请参阅时区。
例如,以下所有值都是有效的时间戳值:
- 2018-08-19 12:11
- 2018-08-19 12:11:35
- 2018-08-19 12:11:35.22
- 2018/08/19 12:11
- 2018-07-05 12:54:00 UTC
- 2018-08-19 07:11:35.220 -05:00
- 2018-08-19T12:11:35.220Z
如果您提供了一个架构,BigQuery 还可接受 Unix 纪元时间作为时间戳值。但是,架构自动检测功能不会检测这种情况,而是将值视为数值或字符串类型。
Unix 纪元时间戳值示例:
- 1534680695
- 1.534680695e11
数组(重复字段)。该值必须是 JSON 数组或 null
。JSON null
会转换为 SQL NULL
。数组本身不能包含 null
值。
架构自动检测功能
本部分介绍加载 JSON 文件时架构自动检测的行为。
JSON 嵌套和重复字段
BigQuery 会推断 JSON 文件中的嵌套和重复字段。如果字段值是 JSON 对象,BigQuery 会以 RECORD
类型加载该列。如果字段值是数组,BigQuery 会将该列作为重复列加载。如需查看包含嵌套和重复数据的 JSON 数据示例,请参阅加载嵌套和重复的 JSON 数据。
字符串转换
如果启用架构自动检测功能,则 BigQuery 会尽可能将字符串转换为布尔值、数字或日期/时间类型。例如,使用以下 JSON 数据,架构自动检测会将 id
字段转换为 INTEGER
列:
{ "name":"Alice","id":"12"}
{ "name":"Bob","id":"34"}
{ "name":"Charles","id":"45"}
编码类型
BigQuery 预期 JSON 数据采用 UTF-8 编码。如果您的 JSON 文件包含其他受支持的编码类型,则应使用 --encoding
标志明确指定编码,以便 BigQuery 将数据转换为 UTF-8。
BigQuery 支持以下 JSON 文件编码类型:
- UTF-8
- ISO-8859-1
- UTF-16BE(UTF-16 大端字节序)
- UTF-16LE(UTF-16 小端字节序)
- UTF-32BE(UTF-32 大端字节序)
- UTF-32LE(UTF-32 小端字节序)
JSON 选项
如需更改 BigQuery 解析 JSON 数据的方式,请在 Google Cloud 控制台、bq 命令行工具、API 或客户端库中指定其他选项。
JSON 选项 | 控制台选项 | bq 工具标志 | BigQuery API 属性 | 说明 |
---|---|---|---|---|
允许的错误记录数 | 允许的错误数 | --max_bad_records |
maxBadRecords (Java、Python) |
(可选)BigQuery 在运行作业时可忽略的错误记录数上限。如果错误记录数超过该值,作业结果中将返回无效错误。默认值为“0”,表示所有记录都必须有效。 |
未知值 | 忽略未知值 | --ignore_unknown_values |
ignoreUnknownValues (Java、Python) |
(可选)表示 BigQuery 是否应允许表架构中不存在的额外值。如果值为 true,将忽略额外值。如果值为 false,则含有额外列的记录将被视为错误记录;如果错误记录太多,作业结果中将返回一个无效记录错误。默认值为 false。“sourceFormat”属性决定了 BigQuery 将哪些项视为额外值:CSV:末尾列;JSON:与所有列名称均不匹配的指定值。 |
编码 | 无 | -E 或 --encoding |
encoding (Python) |
(可选)数据的字符编码。支持的值包括 UTF-8、ISO-8859-1、UTF-16BE、UTF-16LE、UTF-32BE 或 UTF-32LE。默认值为 UTF-8。 |
后续步骤
- 如需了解如何从本地文件加载 JSON 数据,请参阅从本地文件加载数据。
- 如需详细了解如何创建、提取和查询 JSON 数据,请参阅在 GoogleSQL 中使用 JSON 数据。