本页介绍了如何将 FHIR 资源批量导出到 BigQuery 进行探索和分析。导出操作会为 FHIR 存储区中的每种 FHIR 资源类型创建一个 BigQuery 表。
如需提高查询性能并降低费用,不妨考虑将 FHIR 资源导出到分区表。如需了解相关说明,请参阅将 FHIR 资源导出到分区表。
如果您按计划导出 FHIR 资源,请考虑增量导出数据。如需了解相关说明,请参阅增量导出。
设置 BigQuery 权限
在将 FHIR 资源导出到 BigQuery 之前,您必须向 Cloud Healthcare Service Agent 服务账号授予其他权限。如需了解详情,请参阅FHIR 存储区 BigQuery 权限。
了解导出行为
导出操作的行为取决于以下因素:
- 目标表是否存在。
- 您是否设置了
force
字段。 - 您是否在
WriteDisposition
中指定了枚举。如果您指定了枚举,请勿设置force
字段。
每种情况下的行为如下:
- 目标表已存在且
force
设置为true
:导出操作会覆盖现有表 - 目标表已存在,并且
force
设置为false
:会发生错误 - 目标表不存在:无论您是否指定
force
字段,导出操作都会创建一个新表 目标表已存在,并且您将
WriteDisposition
设置为WRITE_TRUNCATE
或WRITE_APPEND
:导出操作会成功,而不是返回错误
该操作会为 FHIR 存储区中的每种资源类型输出一个 BigQuery 表。
批量导出 FHIR 资源
以下示例展示了如何将 FHIR 资源导出到 BigQuery 表。
指定 BigQuery 目标时,请使用完全限定的 URI:
bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID
控制台
如需使用 Google Cloud 控制台将 FHIR 资源导出到 BigQuery,请完成以下步骤:
在 Google Cloud 控制台中,进入数据集页面。
点击包含要导出数据的 FHIR 存储区的数据集。
在 FHIR 存储区所在的行中,打开操作列表,然后选择导出。
在随即显示的导出 FHIR 资源页面上,找到选择目标位置部分。选择 BigQuery 表。
在目标表的写入处置部分中,选择以下选项之一以确定导出操作的行为:
- 仅在目标表为空时导出数据:这相当于在
WriteDisposition
中选择WRITE_EMPTY
枚举。 - 将数据附加到目标表:这相当于在
WriteDisposition
中选择WRITE_APPEND
枚举。 - 在写入 FHIR 资源之前清空目标表中的所有现有数据:这相当于在
WriteDisposition
中选择WRITE_TRUNCATE
枚举。
- 仅在目标表为空时导出数据:这相当于在
在 FHIR 导出配置部分中,点击浏览以选择 BigQuery 项目和数据集。
在架构类型下拉菜单中,选择 BigQuery 表的输出架构。以下架构可用:
- Google Analytics 。基于 SQL on FHIR 文档的架构。由于 BigQuery 仅允许每个表包含 10,000 个列,因此系统不会为
Parameters.parameter.resource
、Bundle.entry.resource
和Bundle.entry.response.outcome
字段生成架构。 - Google Analytics V2。与 Google Analytics 架构类似的架构,但增加了对以下内容的支持:与 Google Analytics 架构相比,Google Analytics V2 架构在目标表中占用的空间更多。
- Google Analytics 。基于 SQL on FHIR 文档的架构。由于 BigQuery 仅允许每个表包含 10,000 个列,因此系统不会为
在递归结构深度滑块中选择一个深度级别,以设置输出架构中所有递归结构的深度。默认情况下,递归值为 2。
如需了解详情,请参阅
recursiveStructureDepth
。点击导出,将 FHIR 资源导出到 BigQuery。
- 要跟踪操作的状态,请点击操作标签页。操作完成后,系统会显示以下指示:
- 长时间运行的操作状态部分下方的确定标题下会显示一个绿色的对勾标记。
- 概览部分在操作 ID 的同一行中显示一个绿色对勾标记和一个确定指示符。
gcloud
如需将 FHIR 资源导出到 BigQuery,请运行 gcloud healthcare fhir-stores export bq
命令。
导出 FHIR 资源。
在使用下面的命令数据之前,请先进行以下替换:
- PROJECT_ID:您的 Google Cloud 项目的 ID
- LOCATION:数据集位置
- DATASET_ID:FHIR 存储区的父数据集
- FHIR_STORE_ID:FHIR 存储区 ID
- BIGQUERY_DATASET_ID:您要将 FHIR 资源导出到的现有 BigQuery 数据集的名称
- SCHEMA_TYPE:
SchemaType
的值。请使用以下某个值:analytics
。基于 SQL on FHIR 文档的架构。由于 BigQuery 仅允许每个表包含 10,000 个列,因此系统不会为Parameters.parameter.resource
、Bundle.entry.resource
和Bundle.entry.response.outcome
字段生成架构。analytics_v2
。与analytics
类似的架构,但增加了对以下内容的支持:与
analytics
相比,analytics-v2
在目标表中占用的空间更多。
- WRITE_DISPOSITION:
WriteDisposition
的值。请使用以下某个值:write-empty
。仅在目标 BigQuery 表为空时才导出数据。write-truncate
。请先清空 BigQuery 表中的所有现有数据,然后再写入 FHIR 资源。write-append
。将数据附加到目标 BigQuery 表。
- FHIR_RESOURCE_TYPE:可选字段。指定一个或多个以英文逗号分隔的 FHIR 资源类型,以便仅导出这些类型的 FHIR 资源。
- SINCE_TIMESTAMP:可选字段。指定一个格式为
YYYY-MM-DDThh:mm:ss.sss+zz:zz
的值,以便仅导出在特定时间之后更新的 FHIR 资源。请指定精确到秒的时间,并包含时区。例如,2015-02-07T13:28:17.239+02:00
和2017-01-01T00:00:00Z
是有效的时间。
执行以下命令:
Linux、macOS 或 Cloud Shell
gcloud healthcare fhir-stores export bq FHIR_STORE_ID \ --location=LOCATION \ --dataset=DATASET_ID \ --bq-dataset=bq://PROJECT_ID.BIGQUERY_DATASET_ID \ --schema-type=SCHEMA_TYPE \ --write-disposition=WRITE_DISPOSITION \ --resource-type=FHIR_RESOURCE_TYPE \ --since=SINCE_TIMESTAMP
Windows (PowerShell)
gcloud healthcare fhir-stores export bq FHIR_STORE_ID ` --location=LOCATION ` --dataset=DATASET_ID ` --bq-dataset=bq://PROJECT_ID.BIGQUERY_DATASET_ID ` --schema-type=SCHEMA_TYPE ` --write-disposition=WRITE_DISPOSITION ` --resource-type=FHIR_RESOURCE_TYPE ` --since=SINCE_TIMESTAMP
Windows (cmd.exe)
gcloud healthcare fhir-stores export bq FHIR_STORE_ID ^ --location=LOCATION ^ --dataset=DATASET_ID ^ --bq-dataset=bq://PROJECT_ID.BIGQUERY_DATASET_ID ^ --schema-type=SCHEMA_TYPE ^ --write-disposition=WRITE_DISPOSITION ^ --resource-type=FHIR_RESOURCE_TYPE ^ --since=SINCE_TIMESTAMP
name
字段中输出操作的名称。记下OPERATION_ID
的值。下一步中您需要用到该值。响应
Request issued for: [FHIR_STORE_ID] Waiting for operation [projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID] to complete...⠏ name: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID
如需详细了解该操作,请运行
gcloud healthcare operations describe
并从响应中提供 OPERATION_ID。在使用下面的命令数据之前,请先进行以下替换:
- PROJECT_ID:您的 Google Cloud 项目的 ID
- DATASET_ID:数据集 ID
- LOCATION:数据集位置
- OPERATION_ID:从长时间运行的操作返回的 ID
执行以下命令:
Linux、macOS 或 Cloud Shell
gcloud healthcare operations describe OPERATION_ID \ --project=PROJECT_ID \ --dataset=DATASET_ID \ --location=LOCATION
Windows (PowerShell)
gcloud healthcare operations describe OPERATION_ID ` --project=PROJECT_ID ` --dataset=DATASET_ID ` --location=LOCATION
Windows (cmd.exe)
gcloud healthcare operations describe OPERATION_ID ^ --project=PROJECT_ID ^ --dataset=DATASET_ID ^ --location=LOCATION
您应该会收到类似如下所示的响应:
响应
done: true // If there were any errors, an `error` field displays instead of a `response` field. // See Troubleshooting long-running operations for a list of response codes. error: ERROR code: ERROR_CODE message: DESCRIPTION metadata: '@type': 'type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata' apiMethodName: 'google.cloud.healthcare.v1.fhir.FhirStoreService.ExportResources_bq' counter: success: 'SUCCESS_COUNT' // If there were any failures, they display in the `failure` field. failure: 'FAILURE_COUNT' createTime: 'YYYY-MM-DDTHH:MM:SS+ZZ:ZZ' endTime: 'YYYY-MM-DDTHH:MM:SS+ZZ:ZZ' logsUrl: https://console.cloud.google.com/CLOUD_LOGGING_URL name: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID // The `response` field only displays if there were no errors. response: '@type': 'type.googleapis.com/google.cloud.healthcare.v1.fhir.ExportResourcesResponse'
REST
如需将 FHIR 资源导出到 BigQuery,请使用 projects.locations.datasets.fhirStores.export
方法。
导出 FHIR 资源:
在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:您的 Google Cloud 项目的 ID
- LOCATION:数据集位置
- DATASET_ID:FHIR 存储区的父数据集
- FHIR_STORE_ID:FHIR 存储区 ID
- BIGQUERY_DATASET_ID:您要将 FHIR 资源导出到的现有 BigQuery 数据集的名称
- SCHEMA_TYPE:
SchemaType
的值。请使用以下某个值:ANALYTICS
。基于 SQL on FHIR 文档的架构。由于 BigQuery 仅允许每个表包含 10,000 个列,因此系统不会为Parameters.parameter.resource
、Bundle.entry.resource
和Bundle.entry.response.outcome
字段生成架构。ANALYTICS_V2
。与ANALYTICS
类似的架构,但增加了对以下内容的支持:
。ANALYTICS_V2
在目标表中占用的空间比ANALYTICS
多
- WRITE_DISPOSITION:
WriteDisposition
的值。请使用以下某个值:WRITE_EMPTY
。仅在目标 BigQuery 表为空时才导出数据。WRITE_TRUNCATE
。请先清空 BigQuery 表中的所有现有数据,然后再写入 FHIR 资源。WRITE_APPEND
。将数据附加到目标 BigQuery 表。
- FHIR_RESOURCE_TYPE:可选字段。指定一个或多个以英文逗号分隔的 FHIR 资源类型,以便仅导出这些类型的 FHIR 资源。
- SINCE_TIMESTAMP:可选字段。指定一个格式为
YYYY-MM-DDThh:mm:ss.sss+zz:zz
的值,以便仅导出在特定时间之后更新的 FHIR 资源。请指定精确到秒的时间,并包含时区。例如,2015-02-07T13:28:17.239+02:00
和2017-01-01T00:00:00Z
是有效的时间。
请求 JSON 正文:
{ "bigqueryDestination": { "datasetUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID", "schemaConfig": { "schemaType": "SCHEMA_TYPE", }, "writeDisposition": "WRITE_DISPOSITION" }, "_type": "FHIR_RESOURCE_TYPE", "_since": "SINCE_TIMESTAMP" }
如需发送请求,请选择以下方式之一:
curl
将请求正文保存在名为
request.json
的文件中。在终端中运行以下命令,在当前目录中创建或覆盖此文件:cat > request.json << 'EOF' { "bigqueryDestination": { "datasetUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID", "schemaConfig": { "schemaType": "SCHEMA_TYPE", }, "writeDisposition": "WRITE_DISPOSITION" }, "_type": "FHIR_RESOURCE_TYPE", "_since": "SINCE_TIMESTAMP" } EOF
然后,执行以下命令以发送 REST 请求:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:export"PowerShell
将请求正文保存在名为
request.json
的文件中。在终端中运行以下命令,在当前目录中创建或覆盖此文件:@' { "bigqueryDestination": { "datasetUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID", "schemaConfig": { "schemaType": "SCHEMA_TYPE", }, "writeDisposition": "WRITE_DISPOSITION" }, "_type": "FHIR_RESOURCE_TYPE", "_since": "SINCE_TIMESTAMP" } '@ | Out-File -FilePath request.json -Encoding utf8
然后,执行以下命令以发送 REST 请求:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:export" | Select-Object -Expand ContentAPI Explorer
复制请求正文并打开方法参考页面。APIs Explorer 面板会在页面右侧打开。您可以与此工具进行交互以发送请求。 将请求正文粘贴到此工具中,填写任何其他必填字段,然后点击执行。
OPERATION_ID
的值。下一步中您需要用到该值。使用
projects.locations.datasets.operations.get
方法获取长时间运行的操作的状态。在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:您的 Google Cloud 项目的 ID
- DATASET_ID:数据集 ID
- LOCATION:数据集位置
- OPERATION_ID:从长时间运行的操作返回的 ID
如需发送请求,请选择以下方式之一:
curl
执行以下命令:
curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"PowerShell
执行以下命令:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method GET `
-Headers $headers `
-Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand ContentAPI Explorer
打开方法参考页面。APIs Explorer 面板会在页面右侧打开。您可以与此工具进行交互以发送请求。 填写所有必填字段,然后点击执行。
"done": true
,则表示长时间运行的操作已完成。
将 FHIR 资源导出到分区表
如需将 FHIR 资源导出到 BigQuery 分区表,请在 FHIR 存储区的 lastUpdatedPartitionConfig
字段中设置 TimePartitioning
枚举。
分区表的运作方式与 BigQuery 按时间单位分区表类似。分区表中添加了一个名为 lastUpdated
的列,该列与从 FHIR 资源中的 meta.lastUpdated
字段生成的 meta.lastUpdated
列重复。BigQuery 使用 lastUpdated
列按小时、天、月或年对表进行分区。
如需有关如何选择分区粒度的建议,请参阅选择每日、每小时、每月或每年分区。
您无法将现有的非分区 BigQuery 表转换为分区表。如果您将患者资源更改导出到非分区 Patients
表,然后创建一个具有表分区的新 FHIR 存储区并将其导出到同一 BigQuery 数据集,Cloud Healthcare API 仍会将数据导出到非分区 Patients
表。如需开始使用分区表,请删除现有的 Patients
表或使用其他 BigQuery 数据集。
如果您向现有 FHIR 存储空间配置添加分区,仍然可以导出到现有的非分区表。不过,分区只会对新表生效。
以下示例展示了如何将 FHIR 资源导出到 BigQuery 分区表。
控制台
Google Cloud 控制台和 gcloud CLI 不支持此操作。请改用 curl
、PowerShell 或您的首选语言。
gcloud
Google Cloud 控制台和 gcloud CLI 不支持此操作。请改用 curl
、PowerShell 或您的首选语言。
REST
如需将 FHIR 资源导出到 BigQuery 分区表,请使用 projects.locations.datasets.fhirStores.export
方法。
导出 FHIR 资源:
在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:您的 Google Cloud 项目的 ID
- LOCATION:数据集位置
- DATASET_ID:FHIR 存储区的父数据集
- FHIR_STORE_ID:FHIR 存储区 ID
- BIGQUERY_DATASET_ID:您要将 FHIR 资源导出到的现有 BigQuery 数据集的名称
- SCHEMA_TYPE:
SchemaType
的值。请使用以下某个值:ANALYTICS
。基于 SQL on FHIR 文档的架构。由于 BigQuery 仅允许每个表包含 10,000 个列,因此系统不会为Parameters.parameter.resource
、Bundle.entry.resource
和Bundle.entry.response.outcome
字段生成架构。ANALYTICS_V2
。与ANALYTICS
类似的架构,但增加了对以下内容的支持:
。ANALYTICS_V2
在目标表中占用的空间比ANALYTICS
多
- TIME_PARTITION_TYPE:用于对导出的 FHIR 资源进行分区的粒度。请使用以下某个值:
HOUR
:按小时对数据进行分区DAY
:按天对数据分区MONTH
:按月对数据进行分区YEAR
:按年份对数据进行分区
- WRITE_DISPOSITION:
WriteDisposition
的值。请使用以下某个值:WRITE_EMPTY
:仅在 BigQuery 表为空时才导出数据。WRITE_TRUNCATE
:在写入 DICOM 实例之前,请先清空 BigQuery 表中的所有现有数据。WRITE_APPEND
:将数据附加到 BigQuery 表。
请求 JSON 正文:
{ "bigqueryDestination": { "datasetUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID", "schemaConfig": { "schemaType": "SCHEMA_TYPE", "lastUpdatedPartitionConfig": { "type": "TIME_PARTITION_TYPE" } }, "writeDisposition": "WRITE_DISPOSITION" } }
如需发送请求,请选择以下方式之一:
curl
将请求正文保存在名为
request.json
的文件中。在终端中运行以下命令,在当前目录中创建或覆盖此文件:cat > request.json << 'EOF' { "bigqueryDestination": { "datasetUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID", "schemaConfig": { "schemaType": "SCHEMA_TYPE", "lastUpdatedPartitionConfig": { "type": "TIME_PARTITION_TYPE" } }, "writeDisposition": "WRITE_DISPOSITION" } } EOF
然后,执行以下命令以发送 REST 请求:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:export"PowerShell
将请求正文保存在名为
request.json
的文件中。在终端中运行以下命令,在当前目录中创建或覆盖此文件:@' { "bigqueryDestination": { "datasetUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID", "schemaConfig": { "schemaType": "SCHEMA_TYPE", "lastUpdatedPartitionConfig": { "type": "TIME_PARTITION_TYPE" } }, "writeDisposition": "WRITE_DISPOSITION" } } '@ | Out-File -FilePath request.json -Encoding utf8
然后,执行以下命令以发送 REST 请求:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:export" | Select-Object -Expand ContentAPI Explorer
复制请求正文并打开方法参考页面。APIs Explorer 面板会在页面右侧打开。您可以与此工具进行交互以发送请求。 将请求正文粘贴到此工具中,填写任何其他必填字段,然后点击执行。
您应该收到类似以下内容的 JSON 响应:
使用
projects.locations.datasets.operations.get
方法获取长时间运行的操作的状态。在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:您的 Google Cloud 项目的 ID
- DATASET_ID:数据集 ID
- LOCATION:数据集位置
- OPERATION_ID:从长时间运行的操作返回的 ID
如需发送请求,请选择以下方式之一:
curl
执行以下命令:
curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"PowerShell
执行以下命令:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method GET `
-Headers $headers `
-Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand ContentAPI Explorer
打开方法参考页面。APIs Explorer 面板会在页面右侧打开。您可以与此工具进行交互以发送请求。 填写所有必填字段,然后点击执行。
"done": true
,则表示长时间运行的操作已完成。
查询分区表
如需降低查询分区表时的查询费用,请使用 WHERE
子句按时间单位进行过滤。
例如,假设您将 PartitionType
枚举设置为 DAY
。如需查询 Patients
表中在特定日期更新的患者资源,请运行以下查询:
SELECT * FROM `PROJECT_ID.BIGQUERY_DATASET.Patients` WHERE DATE(lastUpdated) = 'YYYY-MM-DD'
增量导出
您可以指定时间戳,以便仅导出自上次成功导出以来添加到 FHIR 存储区的 FHIR 资源。这可以提高性能,避免重新导出整个 FHIR 存储空间的费用,同时确保导出的数据始终是最新的。
调用 fhirStores.export
时,请在 _since
字段中指定时间戳。
在 BigQuery 中查询和分析 FHIR 数据
将 FHIR 资源导出到 BigQuery 后,请参阅在 BigQuery 中分析 FHIR 数据解决方案,了解如何查询和分析导出的数据。该解决方案使用 FHIR 中由 Synthea™ 生成的合成数据 公共数据集,该数据集托管了在 Synthea™ 中使用 FHIR 格式生成的超过 100 万条合成患者记录。
对 FHIR 导出请求进行问题排查
如果在执行 FHIR 导出请求期间发生错误,则错误会记录到 Cloud Logging。如需了解详情,请参阅在 Cloud Logging 中查看错误日志。
如果整个操作返回错误,请参阅排查长时间运行的操作问题。
无法将列从 NULLABLE 转换为 REPEATED
此错误是由重复延期引起的。如需解决此错误,请使用 ANALYTICS_V2
架构类型。如果您使用的是 ANALYTICS_V2
,则两个扩展程序之间可能会发生冲突,或者扩展程序与其他字段之间可能会发生冲突。
列名称是根据扩展程序网址中最后一个 /
字符后面的文本生成的。如果扩展程序网址以 /resource_field name
等值结尾,则可能会发生冲突。\
为防止再次出现此错误,如果扩展程序的字段名称与要填充的资源字段相同,请勿使用扩展程序。
后续步骤
- 如需详细了解 BigQuery 中的数据治理和安全,请参阅数据安全和治理概览。