将 DICOM 元数据流式传输到 BigQuery

本页介绍了如何配置 DICOM 存储区,以便在发生以下任一情况时将 DICOM 实例元数据导出到 BigQuery 表:

将 DICOM 元数据流式传输到 BigQuery 表会将该表与 DICOM 数据同步,以便您对最新版本的 DICOM 存储区运行复杂查询。

准备工作

在配置 DICOM 存储区之前,请完成以下

设置 BigQuery 权限

在将 DICOM 元数据流式传输到 BigQuery 之前,您必须向 Cloud Healthcare Service Agent 服务账号授予所需权限。如需了解详情,请参阅 DICOM 存储区 BigQuery 权限

了解如何将 DICOM 元数据导出到 BigQuery

在配置流式传输之前,请了解如何将 DICOM 元数据导出到 BigQuery

配置 DICOM 存储区

如需启用将数据流式传输到 BigQuery 的功能,请在 DICOM 存储区中配置 StreamConfig 对象。在 StreamConfig 对象中,将 BigQueryDestination 对象设置为完全限定的 BigQuery 表 URI,作为 DICOM 实例元数据目标。

您最多可以指定五个 BigQuery 目标位置,以英文逗号分隔的 JSON 对象的形式。

删除 DICOM 存储区中的 DICOM 实例不会删除包含这些实例元数据的 BigQuery 行。

控制台

如需更新 DICOM 存储区以启用 BigQuery 流式传输,请完成以下步骤:

  1. 在 Google Cloud 控制台中,进入数据集页面。
    进入“数据集”
  2. 选择包含您要修改的 DICOM 存储区的数据集。
  3. 选择要为其添加流式传输配置的 DICOM 存储区。
  4. 数据存储空间详情页面的概览标签页中,点击添加新的流式传输配置
  5. 新直播配置字段中,点击浏览
    1. 选择表窗格中,选择一个 BigQuery 表。
    2. 点击选择
  6. 点击完成

REST

以下示例展示了如何更新 DICOM 存储区以启用 BigQuery 流式传输。在这些示例中,DICOM 存储区和 BigQuery 表位于同一项目中。要将 DICOM 元数据导出到其他项目,请参阅将 DICOM 元数据导出到其他项目

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:您的 Google Cloud 项目的 ID
  • LOCATION:数据集位置
  • DATASET_ID:DICOM 存储区的父级数据集
  • DICOM_STORE_ID:DICOM 存储区 ID
  • BIGQUERY_DATASET_ID:现有 BigQuery 数据集的名称
  • BIGQUERY_TABLE_ID:BigQuery 数据集中表的唯一名称。如需了解命名要求,请参阅表命名。BigQuery 数据集必须存在,但 Cloud Healthcare API 可以更新现有表或创建新表。

请求 JSON 正文:

{
  'streamConfigs': [{
     'bigqueryDestination': {
      'tableUri': 'bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID'
     }
  }]
}

如需发送请求,请选择以下方式之一:

curl

将请求正文保存在名为 request.json 的文件中。在终端中运行以下命令,在当前目录中创建或覆盖此文件:

cat > request.json << 'EOF'
{
  'streamConfigs': [{
     'bigqueryDestination': {
      'tableUri': 'bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID'
     }
  }]
}
EOF

然后,执行以下命令以发送 REST 请求:

curl -X PATCH \
-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/dicomStores/DICOM_STORE_ID?updateMask=streamConfigs"

PowerShell

将请求正文保存在名为 request.json 的文件中。在终端中运行以下命令,在当前目录中创建或覆盖此文件:

@'
{
  'streamConfigs': [{
     'bigqueryDestination': {
      'tableUri': 'bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID'
     }
  }]
}
'@  | Out-File -FilePath request.json -Encoding utf8

然后,执行以下命令以发送 REST 请求:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method PATCH `
-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/dicomStores/DICOM_STORE_ID?updateMask=streamConfigs" | Select-Object -Expand Content

API Explorer

复制请求正文并打开方法参考页面。APIs Explorer 面板会在页面右侧打开。您可以与此工具进行交互以发送请求。 将请求正文粘贴到此工具中,填写任何其他必填字段,然后点击执行

您应该收到类似以下内容的 JSON 响应:

删除元数据

在之前的 Cloud Healthcare API 版本中,只有在将 DICOM 实例插入 DICOM 存储区时,才会将 DICOM 实例元数据导出到 BigQuery。添加了用于写入删除操作元数据的功能后,系统会向包含 DICOM 元数据的生成表中添加两个名为 TypeLastUpdated 的新列。

在引入删除元数据之前存在的表中的任何元数据都具有这些列的 NULL 值。NULL 是最小值,在按降序排序时会显示在最后面。

生成的 BigQuery 视图

当您在 DICOM 存储区中插入或删除 DICOM 实例时,系统会更新配置的 BigQuery 表。

如果该表的视图不存在,系统会创建该视图。否则,系统会更新视图。

限制和其他行为

导出的元数据中可能缺少某些 DICOM 标记。如果是,则缺少的标记会添加到目标 BigQuery 表中名为 DroppedTags.TagName 的单独列中。

标记缺失可能由以下某种原因所致:

  • DICOM 标记是排除的 VR 中列出的不受支持的 VR。
  • DICOM 标记大约超过 1 MB。
  • 目标 BigQuery 表中的列数超过了列数上限。将 DICOM 元数据导出到 BigQuery 表时,如果超出列数限制,系统会将与现有列不匹配的 DICOM 标记添加到 DroppedTags.Name 列。如果无法添加 DroppedTags 列,系统会在不发送通知的情况下舍弃 DICOM 标记,并生成警告日志。如需了解详情,请参阅排查用于查看日志的 DICOM 流式传输请求问题

将删除元数据纳入现有表

生成的视图的行为取决于其基表是否包含在引入删除元数据功能之前添加的元数据。

假设某个 BigQuery 表包含支持删除元数据之前的 DICOM 元数据,然后出现以下情况:

  1. 您将 DICOM 实例插入 DICOM 存储区。
  2. 您从 DICOM 存储区中删除 DICOM 实例。
  3. 您可以修改原始 DICOM 实例的标记,并将修改后的 DICOM 实例插入 DICOM 存储区。

由于 BigQuery 表在支持删除元数据之前包含原始元数据,因此原始 DICOM 实例及其修改版本具有相同的研究、系列和实例唯一标识符 (UID)。生成的视图可能包含原始 DICOM 实例或最新的 DICOM 实例。如果没有 LastUpdated 列,视图将无法确定哪个 DICOM 实例较新。

为确保您查询的是最新的 DICOM 实例元数据,请执行以下操作之一:

  • 查询基表,而不是视图。确保查询会在修改后的 DICOM 实例中搜索更新后的标记。
  • 删除包含 DICOM 元数据的现有表,然后通过手动将 DICOM 元数据导出到 BigQuery 重新创建该表。重新创建的表包含 LastUpdated 列。

    此选项会移除历史流式元数据,但会确保表包含包含有效值的 LastUpdated 列。

排查 DICOM 流式传输请求问题

如果在 BigQuery 请求中执行 DICOM 导出元数据期间发生错误,则错误将记入 Cloud Logging 中。如需了解详情,请参阅在 Cloud Logging 中查看错误日志

如需在 Google Cloud 控制台中过滤流式 DICOM 元数据错误日志,请完成以下步骤:

  1. 前往日志浏览器页面。

    转到日志浏览器

  2. 查询字段中,输入以下查询:

    logName="healthcare.googleapis.com%2Fdicom_stream"
    
  3. 点击运行查询

    所有错误日志都会显示在查询结果部分中。