本页面介绍了如何将 FHIR 资源导出到 BigQuery 以进行探索和分析。导出操作会为 FHIR 存储区中的每种 FHIR 资源类型输出一个 BigQuery 表。
如需提高查询性能并降低费用,您可以将 BigQuery 流式传输配置为分区表。如需了解相关说明,请参阅将 FHIR 资源导出到分区表。
设置 BigQuery 权限
在将 FHIR 资源导出到 BigQuery 之前,您必须向 Cloud Healthcare Service Agent 服务账号授予其他权限。如需了解详情,请参阅FHIR 存储区 BigQuery 权限。
导出 FHIR 资源
以下示例展示了如何将 FHIR 资源导出到 BigQuery 表。
设置 BigQuery 目标时,请使用完全限定的 URI,如下所示:
bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID
导出操作的行为可能会因以下方面而有所不同:
- 目标表是否已存在。
- 您是否设置了
force
字段。 - 是否在
WriteDisposition
中指定枚举。如果您指定枚举,请勿设置force
字段,
上述每种情况下的行为如下:
- 如果目标表已存在,并且
force
设置为true
,则导出操作会覆盖现有表。 - 如果目标表已存在,并且
force
设置为false
,则会发生错误。 - 如果目标表尚不存在,则无论您是否指定
force
字段,导出操作都会创建一个新表。 - 使用
WriteDisposition
时,如果目标表已存在且为空,则导出操作会成功完成,而不是返回错误。
该操作会为 FHIR 存储区中的每种资源类型输出一个 BigQuery 表。
控制台
如需使用 Google Cloud 控制台将 FHIR 资源导出到 BigQuery,请完成以下步骤:
在 Google Cloud 控制台中,进入数据集页面。
点击包含您要导出的数据的 FHIR 存储区的数据集。
在 FHIR 存储区所在的行中,打开操作列表,然后选择导出。
在显示的导出 FHIR 资源页面上,找到选择目标位置部分。选择 BigQuery 表。
在目标表的写入处置方式部分,选择以下选项之一,以确定导出操作的行为:
- 仅在目标表为空时才导出数据:这相当于在
WriteDisposition
中选择WRITE_EMPTY
枚举。 - 将数据附加到目标表:这相当于在
WriteDisposition
中选择WRITE_APPEND
枚举。 - 在写入 FHIR 资源之前清空目标表中的所有现有数据:这相当于在
WriteDisposition
中选择WRITE_TRUNCATE
枚举。
- 仅在目标表为空时才导出数据:这相当于在
在 FHIR 导出配置部分中,点击浏览,选择 BigQuery 项目和数据集。
在架构类型下拉列表中,选择 BigQuery 表的输出架构。可用的架构如下:
- 数据分析。基于 SQL on FHIR 文档的架构。由于 BigQuery 只允许每个表包含 1 万列,因此系统不会为
Parameters.parameter.resource
、Bundle.entry.resource
和Bundle.entry.response.outcome
字段生成架构。 - Google Analytics(分析)V2。一种与 Google Analytics(分析)架构类似的架构,并新增了对以下各项的支持:。与 Google Analytics(分析)架构相比,Google Analytics(分析)V2 架构在目标表中占用的空间更多。
- 数据分析。基于 SQL on FHIR 文档的架构。由于 BigQuery 只允许每个表包含 1 万列,因此系统不会为
在递归结构深度滑块中选择深度级别,以设置输出架构中所有递归结构的深度。默认情况下,递归值为 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 只允许每个表包含 1 万列,因此系统不会为Parameters.parameter.resource
、Bundle.entry.resource
和Bundle.entry.response.outcome
字段生成架构。analytics_v2
。一种类似于analytics
的架构,增加了对以下内容的支持:- 包含重复字段的 Extensions
- 包含的 FHIR 资源
在目标表中,
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
是有效时间。
执行以下命令:
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 只允许每个表包含 1 万列,因此系统不会为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
复制请求正文并打开方法参考页面。API 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
打开方法参考页面。API 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 只允许每个表包含 1 万列,因此系统不会为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
:先清空 BigQuery 表中的所有现有数据,然后再写入 DICOM 实例。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
复制请求正文并打开方法参考页面。API 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
打开方法参考页面。API Explorer 面板会在页面右侧打开。您可以与此工具进行交互以发送请求。填写所有必填字段,然后点击执行。
"done": true
,则表示长时间运行的操作已完成。
查询分区表
如需在查询分区表时降低查询费用,请使用 WHERE
子句按时间单位进行过滤。
例如,假设您将 PartitionType
枚举设置为 DAY
。如需在 Patients
表中查询在特定日期更新的患者资源,请运行以下查询:
SELECT * FROM `PROJECT_ID.BIGQUERY_DATASET.Patients` WHERE DATE(lastUpdated) = 'YYYY-MM-DD'
在 BigQuery 中查询和分析 FHIR 数据
将 FHIR 资源导出到 BigQuery 后,请参阅在 BigQuery 中分析 FHIR 数据解决方案,了解如何查询和分析导出的数据。该解决方案使用 FHIR 中由 Synthea™ 生成的合成数据 公共数据集,该数据集托管了在 Synthea™ 中使用 FHIR 格式生成的超过 100 万条合成患者记录。
对 FHIR 导出请求进行问题排查
如果在执行 FHIR 导出请求期间发生错误,则错误会记录到 Cloud Logging。如需了解详情,请参阅在 Cloud Logging 中查看错误日志。
如果整个操作返回错误,请参阅排查长时间运行的操作问题。
后续步骤
- 如需详细了解 BigQuery 中的数据治理和安全,请参阅数据安全和治理概览。