将 DICOM 元数据导出到 BigQuery

本页面介绍如何将 DICOM 元数据导出到 BigQuery 进行探索和分析。如需了解在导出 DICOM 元数据时创建的 BigQuery 架构,请参阅了解 BigQuery DICOM 架构

设置 BigQuery 权限

在将 DICOM 元数据导出到 BigQuery 表之前,您必须向 Cloud Healthcare Service Agent 服务帐号授予额外的权限。如需了解详情,请参阅 DICOM 存储区 BigQuery 权限

设置 BigQuery 目标位置

设置 BigQuery 目标时,请使用完全限定的 URI,如下所示:
bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID
导出操作的行为可能会因以下因素而异:
  • 目标表是否已存在
  • 设置了 force 字段(使用 API)还是 --overwrite-table 标志(使用 Google Cloud CLI)
  • 您是否已设置 writeDisposition 枚举的值。如果使用 writeDisposition 枚举,请勿设置 force 字段。
上述每种情况下的行为如下:
  • 如果目标表已存在且 force 设置为 true 或指定了 --overwrite-table 标志,则导出操作将覆盖现有表。
  • 如果目标表已存在且 force 设置为 false 或未指定 --overwrite-table 标志,则会发生错误。
  • 如果目标表尚不存在,则无论您指定 force 字段还是 --overwrite-table 标志,都会创建新表。
  • 如需了解 writeDisposition 描述的行为,请参阅其文档。使用 force 时,writeDisposition 枚举执行类似于选项的行为,但存在以下例外情况:如果目标表已存在且为空,则导出操作会完成,而不是返回错误。

导出 DICOM 元数据

以下示例展示了如何将 DICOM 元数据导出到 BigQuery 表。在这些示例中,DICOM 存储区和 BigQuery 表位于同一项目中。如需将 DICOM 元数据导出到其他项目中的 BigQuery 表,请参阅将 DICOM 元数据导出到其他项目

控制台

如需将 DICOM 元数据导出到 BigQuery 表,请完成以下步骤:

  1. 在 Google Cloud 控制台中,进入数据集页面。

    前往“数据集”页面

  2. 点击包含要导出的元数据的 DICOM 存储区的数据集。

  3. 在 DICOM 存储区所在的行中,打开操作列表,然后选择导出

  4. 在显示的导出 DICOM 存储区页面上,选择 BigQuery 表

  5. 项目字段中,点击浏览,然后选择您的项目。

  6. 数据集列表中,选择要导出 DICOM 元数据的 BigQuery 数据集。

  7. 字段中,输入新的表名称。BigQuery 会检查每个选择,以确保目标表有效。

  8. 目标表的写入处置方式部分,选择以下选项之一。这些选项对应于 WriteDisposition 枚举。

    • 仅在目标表为空时才导出数据:相当于 WRITE_EMPTY
    • 将数据附加到目标表:相当于 WRITE_APPEND
    • 在写入实例之前清空目标表中的所有现有数据:相当于 WRITE_TRUNCATE
  9. 点击导出以将 DICOM 元数据导出到 BigQuery 表。

  10. 要跟踪操作的状态,请点击操作标签页。操作完成后,系统会显示以下指示:
    • 长时间运行的操作状态部分下方的确定标题下会显示一个绿色的对勾标记。
    • 概览部分在操作 ID 的同一行中显示一个绿色对勾标记和一个确定指示符。
    如果您遇到任何错误,请点击操作,然后点击在 Cloud Logging 中查看详细信息

gcloud

如需将 DICOM 元数据导出到 BigQuery 表,请运行 gcloud healthcare dicom-stores export bq 命令。

  1. 导出 DICOM 元数据。

    在使用下面的命令数据之前,请先进行以下替换:

    • PROJECT_ID:您的 Google Cloud 项目的 ID
    • LOCATION:数据集位置
    • DATASET_ID: DICOM 存储区的父数据集
    • DICOM_STORE_ID:DICOM 存储区 ID
    • BIGQUERY_DATASET_ID:您要从中导出 DICOM 元数据的现有 BigQuery 数据集的名称
    • BIGQUERY_TABLE_ID:BigQuery 数据集中新表或现有表的名称。如果导出操作是创建新表,请参阅表命名,了解表名称要求。
    • WRITE_DISPOSITIONWriteDisposition 枚举的值。请使用以下某个值:
      • write-empty:仅在 BigQuery 表为空时导出数据。
      • write-truncate:先清空 BigQuery 表中的所有现有数据,然后再写入 DICOM 实例。
      • write-append:将数据附加到 BigQuery 表。

    执行以下命令:

    Linux、macOS 或 Cloud Shell

    gcloud healthcare dicom-stores export bq DICOM_STORE_ID \
      --location=LOCATION \
      --dataset=DATASET_ID \
      --bq-table=bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID \
      --write-disposition=WRITE_DISPOSITION
    

    Windows (PowerShell)

    gcloud healthcare dicom-stores export bq DICOM_STORE_ID `
      --location=LOCATION `
      --dataset=DATASET_ID `
      --bq-table=bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID `
      --write-disposition=WRITE_DISPOSITION
    

    Windows (cmd.exe)

    gcloud healthcare dicom-stores export bq DICOM_STORE_ID ^
      --location=LOCATION ^
      --dataset=DATASET_ID ^
      --bq-table=bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID ^
      --write-disposition=WRITE_DISPOSITION
    
    响应如下所示。响应中包含长时间运行的操作的标识符。如果方法调用可能需要大量时间才能完成,系统就会返回长时间运行的操作。该命令会轮询长时间运行的操作,然后在导出完成后在 name 字段中输出操作的名称。请注意 OPERATION_ID 的值。下一步中需要用到此值。

    响应

    Request issued for: [DICOM_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
    

  2. 如需查看操作的更多详细信息,请运行 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.dicom.DicomService.ExportDicomData_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.protobuf.Empty'
    

REST

如需将 DICOM 元数据导出到 BigQuery 表,请使用 projects.locations.datasets.dicomStores.export 方法。

  1. 导出 DICOM 元数据。

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

    • PROJECT_ID:您的 Google Cloud 项目的 ID
    • LOCATION:数据集位置
    • DATASET_ID: DICOM 存储区的父数据集
    • DICOM_STORE_ID:DICOM 存储区 ID
    • BIGQUERY_DATASET_ID:您要从中导出 DICOM 元数据的现有 BigQuery 数据集的名称
    • BIGQUERY_TABLE_ID:BigQuery 数据集中新表或现有表的名称。如果导出操作是创建新表,请参阅表命名,了解表名称要求。
    • WRITE_DISPOSITIONWriteDisposition 枚举的值。请使用以下某个值:
      • WRITE_EMPTY:仅在 BigQuery 表为空时导出数据。
      • WRITE_TRUNCATE:先清空 BigQuery 表中的所有现有数据,然后再写入 DICOM 实例。
      • WRITE_APPEND:将数据附加到 BigQuery 表。

    请求 JSON 正文:

    {
      "bigqueryDestination": {
          "tableUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID",
          "writeDisposition": "WRITE_DISPOSITION"
      }
    }
    

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

    curl

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

    cat > request.json << 'EOF'
    {
      "bigqueryDestination": {
          "tableUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID",
          "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/dicomStores/DICOM_STORE_ID:export"

    PowerShell

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

    @'
    {
      "bigqueryDestination": {
          "tableUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID",
          "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/dicomStores/DICOM_STORE_ID:export" | Select-Object -Expand Content

    API Explorer

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

    输出如下所示。响应包含长时间运行的操作 (LRO) 的标识符。如果方法调用可能需要更多时间才能完成,系统就会返回长时间运行的操作。请注意 OPERATION_ID 的值。在下一步中,您需要使用此值。

  2. 使用 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 Content

    API Explorer

    打开方法参考页面。API Explorer 面板会在页面右侧打开。您可以与此工具进行交互以发送请求。填写所有必填字段,然后点击执行

    输出如下所示。如果响应包含 "done": true,则表示长时间运行的操作已完成。

将 DICOM 元数据导出到其他项目

如需将 DICOM 元数据从一个项目中的 DICOM 存储区导出到另一个项目中的 BigQuery 数据集,请先参阅将 DICOM 元数据导出到其他项目权限,了解如何在目标项目中设置 IAM 权限。

gcloud

如需将 DICOM 元数据从一个项目中的 DICOM 存储区导出到另一个项目中的 BigQuery 表,请使用 gcloud healthcare dicom-stores export bq 命令。

  1. 导出 DICOM 元数据。

    在使用下面的命令数据之前,请先进行以下替换:

    • SOURCE_PROJECT_ID:来源 Google Cloud 项目的 ID
    • SOURCE_LOCATION:源数据集位置
    • SOURCE_DATASET_ID:源 DICOM 存储区的父数据集
    • SOURCE_DICOM_STORE_ID:源 DICOM 存储区 ID
    • DESTINATION_PROJECT_ID:不同项目的 ID
    • DESTINATION_BIGQUERY_DATASET_ID:您要导出 DICOM 元数据的目标项目中的现有 BigQuery 数据集的名称
    • DESTINATION_BIGQUERY_TABLE_ID:BigQuery 数据集中新表或现有表的名称。如果导出操作是创建新表,请参阅表命名,了解表名称要求。
    • WRITE_DISPOSITIONWriteDisposition 枚举的值。请使用以下某个值:
      • write-empty:仅在 BigQuery 表为空时导出数据。
      • write-truncate:先清空 BigQuery 表中的所有现有数据,然后再写入 DICOM 实例。
      • write-append:将数据附加到 BigQuery 表。

    执行以下命令:

    Linux、macOS 或 Cloud Shell

    gcloud healthcare dicom-stores export bq SOURCE_DICOM_STORE_ID \
      --project=SOURCE_PROJECT_ID \
      --location=SOURCE_LOCATION \
      --dataset=SOURCE_DATASET_ID \
      --bq-table=bq://DESTINATION_PROJECT_ID.DESTINATION_BIGQUERY_DATASET_ID.DESTINATION_BIGQUERY_TABLE_ID \
      --write-disposition=WRITE_DISPOSITION
    

    Windows (PowerShell)

    gcloud healthcare dicom-stores export bq SOURCE_DICOM_STORE_ID `
      --project=SOURCE_PROJECT_ID `
      --location=SOURCE_LOCATION `
      --dataset=SOURCE_DATASET_ID `
      --bq-table=bq://DESTINATION_PROJECT_ID.DESTINATION_BIGQUERY_DATASET_ID.DESTINATION_BIGQUERY_TABLE_ID `
      --write-disposition=WRITE_DISPOSITION
    

    Windows (cmd.exe)

    gcloud healthcare dicom-stores export bq SOURCE_DICOM_STORE_ID ^
      --project=SOURCE_PROJECT_ID ^
      --location=SOURCE_LOCATION ^
      --dataset=SOURCE_DATASET_ID ^
      --bq-table=bq://DESTINATION_PROJECT_ID.DESTINATION_BIGQUERY_DATASET_ID.DESTINATION_BIGQUERY_TABLE_ID ^
      --write-disposition=WRITE_DISPOSITION
    
    响应如下所示。响应中包含长时间运行的操作的标识符。如果方法调用可能需要大量时间才能完成,系统就会返回长时间运行的操作。该命令会轮询长时间运行的操作,然后在导出完成后在 name 字段中输出操作的名称。请注意 OPERATION_ID 的值。下一步中需要用到此值。

    响应

    Request issued for: [SOURCE_DICOM_STORE_ID]
    Waiting for operation [projects/SOURCE_PROJECT_ID/locations/SOURCE_LOCATION/datasets/SOURCE_DATASET_ID/operations/OPERATION_ID] to complete...⠏
    name: projects/SOURCE_PROJECT_ID/locations/SOURCE_LOCATION/datasets/SOURCE_DATASET_ID/operations/OPERATION_ID
    

  2. 如需查看操作的更多详细信息,请运行 gcloud healthcare operations describe 命令并提供响应中的 OPERATION_ID

    在使用下面的命令数据之前,请先进行以下替换:

    • SOURCE_PROJECT_ID:来源 Google Cloud 项目的 ID
    • SOURCE_LOCATION:源数据集位置
    • SOURCE_DATASET_ID:源数据集 ID
    • OPERATION_ID:从长时间运行的操作返回的 ID

    执行以下命令:

    Linux、macOS 或 Cloud Shell

    gcloud healthcare operations describe OPERATION_ID \
        --project=SOURCE_PROJECT_ID \
        --dataset=SOURCE_DATASET_ID \
        --location=SOURCE_LOCATION
    

    Windows (PowerShell)

    gcloud healthcare operations describe OPERATION_ID `
        --project=SOURCE_PROJECT_ID `
        --dataset=SOURCE_DATASET_ID `
        --location=SOURCE_LOCATION
    

    Windows (cmd.exe)

    gcloud healthcare operations describe OPERATION_ID ^
        --project=SOURCE_PROJECT_ID ^
        --dataset=SOURCE_DATASET_ID ^
        --location=SOURCE_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.dicom.DicomService.ExportDicomData_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/SOURCE_PROJECT_ID/locations/SOURCE_LOCATION/datasets/SOURCE_DATASET_ID/operations/OPERATION_ID
    // The `response` field only displays if there were no errors.
    response:
      '@type': 'type.googleapis.com/google.protobuf.Empty'
    

REST

如需将 DICOM 元数据从某个项目中的 DICOM 存储区导出到另一个项目中的 BigQuery 表,请使用 projects.locations.datasets.dicomStores.export 方法。

  1. 导出 DICOM 元数据。

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

    • SOURCE_PROJECT_ID:来源 Google Cloud 项目的 ID
    • SOURCE_LOCATION:源数据集位置
    • SOURCE_DATASET_ID:源 DICOM 存储区的父数据集
    • SOURCE_DICOM_STORE_ID:源 DICOM 存储区 ID
    • DESTINATION_PROJECT_ID:不同项目的 ID
    • DESTINATION_BIGQUERY_DATASET_ID:您要导出 DICOM 元数据的目标项目中的现有 BigQuery 数据集的名称
    • DESTINATION_BIGQUERY_TABLE_ID:BigQuery 数据集中新表或现有表的名称。如果导出操作是创建新表,请参阅表命名,了解表名称要求。
    • WRITE_DISPOSITIONWriteDisposition 枚举的值。请使用以下某个值:
      • WRITE_EMPTY:仅在 BigQuery 表为空时导出数据。
      • WRITE_TRUNCATE:先清空 BigQuery 表中的所有现有数据,然后再写入 DICOM 实例。
      • WRITE_APPEND:将数据附加到 BigQuery 表。

    请求 JSON 正文:

    {
      "bigqueryDestination": {
          "tableUri": "bq://DESTINATION_PROJECT_ID.DESTINATION_BIGQUERY_DATASET_ID.DESTINATION_BIGQUERY_TABLE_ID",
          "writeDisposition": "WRITE_DISPOSITION"
      }
    }
    

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

    curl

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

    cat > request.json << 'EOF'
    {
      "bigqueryDestination": {
          "tableUri": "bq://DESTINATION_PROJECT_ID.DESTINATION_BIGQUERY_DATASET_ID.DESTINATION_BIGQUERY_TABLE_ID",
          "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/SOURCE_PROJECT_ID/locations/SOURCE_LOCATION/datasets/SOURCE_DATASET_ID/dicomStores/SOURCE_DICOM_STORE_ID:export"

    PowerShell

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

    @'
    {
      "bigqueryDestination": {
          "tableUri": "bq://DESTINATION_PROJECT_ID.DESTINATION_BIGQUERY_DATASET_ID.DESTINATION_BIGQUERY_TABLE_ID",
          "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/SOURCE_PROJECT_ID/locations/SOURCE_LOCATION/datasets/SOURCE_DATASET_ID/dicomStores/SOURCE_DICOM_STORE_ID:export" | Select-Object -Expand Content

    API Explorer

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

    输出如下所示。响应包含长时间运行的操作 (LRO) 的标识符。如果方法调用可能需要更多时间才能完成,系统就会返回长时间运行的操作。请注意 OPERATION_ID 的值。在下一步中,您需要使用此值。

  2. 使用 projects.locations.datasets.operations.get 方法可获取长时间运行的操作的状态。

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

    • SOURCE_PROJECT_ID:来源 Google Cloud 项目的 ID
    • SOURCE_LOCATION:源数据集位置
    • SOURCE_DATASET_ID:源数据集 ID
    • OPERATION_ID:从长时间运行的操作返回的 ID

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

    curl

    执行以下命令:

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/SOURCE_PROJECT_ID/locations/SOURCE_LOCATION/datasets/SOURCE_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/SOURCE_PROJECT_ID/locations/SOURCE_LOCATION/datasets/SOURCE_DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content

    API Explorer

    打开方法参考页面。API Explorer 面板会在页面右侧打开。您可以与此工具进行交互以发送请求。填写所有必填字段,然后点击执行

    输出如下所示。如果响应包含 "done": true,则表示长时间运行的操作已完成。

使用过滤条件导出 DICOM 元数据

默认情况下,将 DICOM 数据导出到 Cloud Storage 时,系统会导出指定 DICOM 存储区中的所有 DICOM 文件。同样,将 DICOM 元数据导出到 BigQuery 时,系统会导出指定 DICOM 存储区中所有 DICOM 数据的元数据。

您可以使用过滤条件导出部分 DICOM 数据或元数据。您可以在过滤条件文件中定义过滤条件。

配置过滤条件文件

过滤条件文件指定要导出到 Cloud Storage 或 BigQuery 的 DICOM 文件。您可以在以下级别配置过滤条件文件:

  • 在研究级别
  • 在系列级别
  • 在实例级别

过滤条件文件由多行组成,其中每一行定义要导出的研究、系列或实例。每行都使用 /studies/STUDY_UID[/series/SERIES_UID[/instances/INSTANCE_UID]] 格式。

如果在传入过滤条件文件时未在过滤条件文件中指定研究、系列或实例,则系统将不会导出该研究、系列或实例。

只需要提供路径的 /studies/STUDY_UID 部分。您可以通过指定 /studies/STUDY_UID 导出整个研究,也可以通过指定 /studies/STUDY_UID/series/SERIES_UID 导出整个系列。

请考虑以下过滤条件文件。该过滤文件将导出一个研究、两个系列和三个单独的实例:

/studies/1.123.456.789
/studies/1.666.333.111/series/123.456
/studies/1.666.333.111/series/567.890
/studies/1.888.999.222/series/123.456/instances/111
/studies/1.888.999.222/series/123.456/instances/222
/studies/1.888.999.222/series/123.456/instances/333

使用 BigQuery 创建过滤条件文件

如需创建过滤条件文件,您通常需要先将 DICOM 存储区中的元数据导出到 BigQuery。这样,您就可以使用 BigQuery 来查看 DICOM 存储区中 DICOM 数据的研究、系列和实例 UID。然后,您可以完成以下步骤:

  1. 查询您感兴趣的研究、系列和实例 UID。例如,将 DICOM 元数据导出到 BigQuery 后,您可以运行以下查询,将研究、系列和实例 UID 串接为符合过滤条件文件要求的格式:
    SELECT CONCAT
        ('/studies/', StudyInstanceUID, '/series/', SeriesInstanceUID, '/instances/', SOPInstanceUID)
    FROM
        [PROJECT_ID:BIGQUERY_DATASET.BIGQUERY_TABLE]
    
  2. 如果查询返回大型结果集,您可以通过将查询结果保存到 BigQuery 中的目标表将新表具体化。
  3. 如果您已将查询结果保存到目标表,则可以将目标表的内容保存到文件,并将文件导出到 Cloud Storage。如需了解如何执行此操作,请参阅导出表数据。导出的文件就是您的过滤条件文件。在导出操作中指定过滤条件时,您将使用过滤条件文件在 Cloud Storage 中的位置。

手动创建过滤条件文件

您可以创建包含自定义内容的过滤条件文件,然后将其上传到 Cloud Storage 存储桶。在导出操作中指定过滤条件时,您将使用过滤条件文件在 Cloud Storage 中的位置。以下示例展示了如何使用 gsutil cp 命令将过滤条件文件上传到 Cloud Storage 存储桶:
gsutil cp FILTER_FILE gs://BUCKET

传入过滤条件文件

创建过滤条件文件后,您可以调用 DICOM 导出操作,并使用 REST API 传入过滤条件文件。以下示例展示了如何使用过滤条件导出 DICOM 元数据。

gcloud

如需使用过滤器将 DICOM 元数据导出到 BigQuery 表,请运行 gcloud beta healthcare dicom-stores export bq 命令。

  1. 导出 DICOM 元数据。

    在使用下面的命令数据之前,请先进行以下替换:

    • PROJECT_ID:您的 Google Cloud 项目的 ID
    • LOCATION:数据集位置
    • DATASET_ID: DICOM 存储区的父数据集
    • DICOM_STORE_ID:DICOM 存储区 ID
    • BIGQUERY_DATASET_ID:您要从中导出 DICOM 元数据的现有 BigQuery 数据集的名称
    • BIGQUERY_TABLE_ID:BigQuery 数据集中新表或现有表的名称。如果导出操作是创建新表,请参阅表命名,了解表名称要求。
    • BUCKET:包含过滤器文件的 Cloud Storage 存储桶的名称。如果过滤器文件位于目录中,请在路径中包括该目录。
    • FILTER_FILE:过滤器文件在 Cloud Storage 存储桶中的位置和名称
    • WRITE_DISPOSITIONWriteDisposition 枚举的值。请使用以下某个值:
      • write-empty:仅在 BigQuery 表为空时导出数据。
      • write-truncate:先清空 BigQuery 表中的所有现有数据,然后再写入 DICOM 实例。
      • write-append:将数据附加到 BigQuery 表。

    执行以下命令:

    Linux、macOS 或 Cloud Shell

    gcloud beta healthcare dicom-stores export bq DICOM_STORE_ID \
      --location=LOCATION \
      --dataset=DATASET_ID \
      --bq-table=bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID \
      --filter-config-gcs-uri=gs://BUCKET/FILTER_FILE \
      --write-disposition=WRITE_DISPOSITION
    

    Windows (PowerShell)

    gcloud beta healthcare dicom-stores export bq DICOM_STORE_ID `
      --location=LOCATION `
      --dataset=DATASET_ID `
      --bq-table=bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID `
      --filter-config-gcs-uri=gs://BUCKET/FILTER_FILE `
      --write-disposition=WRITE_DISPOSITION
    

    Windows (cmd.exe)

    gcloud beta healthcare dicom-stores export bq DICOM_STORE_ID ^
      --location=LOCATION ^
      --dataset=DATASET_ID ^
      --bq-table=bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID ^
      --filter-config-gcs-uri=gs://BUCKET/FILTER_FILE ^
      --write-disposition=WRITE_DISPOSITION
    
    响应如下所示。响应中包含长时间运行的操作的标识符。如果方法调用可能需要大量时间才能完成,系统就会返回长时间运行的操作。该命令会轮询长时间运行的操作,然后在导出完成后在 name 字段中输出操作的名称。请注意 OPERATION_ID 的值。下一步中需要用到此值。

    响应

    Request issued for: [DICOM_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
    

  2. 如需查看操作的更多详细信息,请运行 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.dicom.DicomService.ExportDicomData_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/SOURCE_PROJECT_ID/locations/SOURCE_LOCATION/datasets/SOURCE_DATASET_ID/operations/OPERATION_ID
    // The `response` field only displays if there were no errors.
    response:
      '@type': 'type.googleapis.com/google.protobuf.Empty'
    

REST

如需使用过滤器将 DICOM 元数据导出到 BigQuery 表,请使用 projects.locations.datasets.dicomStores.export 方法。

  1. 导出 DICOM 元数据。

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

    • PROJECT_ID:您的 Google Cloud 项目的 ID
    • LOCATION:数据集位置
    • DATASET_ID: DICOM 存储区的父数据集
    • DICOM_STORE_ID:DICOM 存储区 ID
    • BIGQUERY_DATASET_ID:您要从中导出 DICOM 元数据的现有 BigQuery 数据集的名称
    • BIGQUERY_TABLE_ID:BigQuery 数据集中新表或现有表的名称。如果导出操作是创建新表,请参阅表命名,了解表名称要求。
    • BUCKET:包含过滤器文件的 Cloud Storage 存储桶的名称。如果过滤器文件位于目录中,请在路径中包括该目录。
    • FILTER_FILE:过滤器文件在 Cloud Storage 存储桶中的位置和名称
    • WRITE_DISPOSITIONWriteDisposition 枚举的值。请使用以下某个值:
      • WRITE_EMPTY:仅在 BigQuery 表为空时导出数据。
      • WRITE_TRUNCATE:先清空 BigQuery 表中的所有现有数据,然后再写入 DICOM 实例。
      • WRITE_APPEND:将数据附加到 BigQuery 表。

    请求 JSON 正文:

    {
      "bigqueryDestination": {
          "tableUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID",
          "writeDisposition": "WRITE_DISPOSITION"
      },
      "filterConfig": {
          "resourcePathsGcsUri": "gs://BUCKET/FILTER_FILE"
      }
    }
    

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

    curl

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

    cat > request.json << 'EOF'
    {
      "bigqueryDestination": {
          "tableUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID",
          "writeDisposition": "WRITE_DISPOSITION"
      },
      "filterConfig": {
          "resourcePathsGcsUri": "gs://BUCKET/FILTER_FILE"
      }
    }
    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/dicomStores/DICOM_STORE_ID:export"

    PowerShell

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

    @'
    {
      "bigqueryDestination": {
          "tableUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID",
          "writeDisposition": "WRITE_DISPOSITION"
      },
      "filterConfig": {
          "resourcePathsGcsUri": "gs://BUCKET/FILTER_FILE"
      }
    }
    '@  | 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/dicomStores/DICOM_STORE_ID:export" | Select-Object -Expand Content

    API Explorer

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

    输出如下所示。响应包含长时间运行的操作 (LRO) 的标识符。如果方法调用可能需要更多时间才能完成,系统就会返回长时间运行的操作。请注意 OPERATION_ID 的值。在下一步中,您需要使用此值。

  2. 使用 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 Content

    API Explorer

    打开方法参考页面。API Explorer 面板会在页面右侧打开。您可以与此工具进行交互以发送请求。填写所有必填字段,然后点击执行

    输出如下所示。如果响应包含 "done": true,则表示长时间运行的操作已完成。

在 BigQuery 中查询和分析 DICOM 数据

将 DICOM 元数据导出到 BigQuery 表后,您可以运行示例查询来获取有关元数据的更多详细信息。以下示例展示了如何针对一些常见的用例运行查询。

搜索元数据

假设您要搜索很难在其他系统中搜索的大量元数据,例如图片归档和通信系统 (PACS) 或供应商中性归档 (VNA)。以下查询展示了如何查询患者的 PatientID 值以及如何使用 DICOMweb 路径检索特定映像实例。该示例使用 NIH Chest X-ray 数据集中的 chc-nih-chest-xray.nih_chest_xray.nih_chest_xray 表。

#standardSQL
SELECT CONCAT('/dicomWeb/studies/', StudyInstanceUID, '/series/', SeriesInstanceUID, '/instances/', SOPInstanceUID) as DICOMwebPath
FROM `chc-nih-chest-xray.nih_chest_xray.nih_chest_xray`
WHERE PatientID = '19045';

该查询返回与患者相关的研究。以下响应使用 JSON 格式:

[
  {
    "DICOMwebPath": "/dicomWeb/studies/1.3.6.1.4.1.11129.5.5.169629990647803559688464142879817265366193/series/1.3.6.1.4.1.11129.5.5.141990184899344268273968625887396932057061/instances/1.3.6.1.4.1.11129.5.5.162448513493627342869165322873398445570578"
  },
  {
    "DICOMwebPath": "/dicomWeb/studies/1.3.6.1.4.1.11129.5.5.114160532832901355654444239008681456919023/series/1.3.6.1.4.1.11129.5.5.178361108150351071908200174504411112440700/instances/1.3.6.1.4.1.11129.5.5.145959606905209488520697484018030440952428"
  },
  {
    "DICOMwebPath": "/dicomWeb/studies/1.3.6.1.4.1.11129.5.5.177801331756958922168115732894519725643007/series/1.3.6.1.4.1.11129.5.5.134128639331055702643451404466208677561042/instances/1.3.6.1.4.1.11129.5.5.148534317486838863760908141408862094292875"
  },
  {
    "DICOMwebPath": "/dicomWeb/studies/1.3.6.1.4.1.11129.5.5.119570482687494886334491471870663517807852/series/1.3.6.1.4.1.11129.5.5.148050768676645373034111775531663876425927/instances/1.3.6.1.4.1.11129.5.5.111153708388576066195389700503245704293300"
  },
  {
    "DICOMwebPath": "/dicomWeb/studies/1.3.6.1.4.1.11129.5.5.144704399171290022427247626928443085419319/series/1.3.6.1.4.1.11129.5.5.190285793344339390593165731988543561416633/instances/1.3.6.1.4.1.11129.5.5.110245902713751842026864359179754889505217"
  },
  {
    "DICOMwebPath": "/dicomWeb/studies/1.3.6.1.4.1.11129.5.5.172276126220388966649736649950361623806435/series/1.3.6.1.4.1.11129.5.5.171512371498506519035489729484464872160452/instances/1.3.6.1.4.1.11129.5.5.111721417729733087384317002785068394901165"
  }
]

查询最新研究

假设您希望使用数据集中的最新研究来填充 PACS 读取工作列表。

以下查询展示了如何检索和显示最新研究以及实例计数和相关元数据。该示例使用 TCIA 数据集中的 bigquery-public-data.idc_v5.dicom_metadata 表。

#standardSQL
SELECT
  MIN(CONCAT(StudyDate, ' ', StudyTime)) as StudyDateTime, MIN(PatientID) as PatientID, StudyInstanceUID, COUNT(*) as InstanceCount
FROM
 `bigquery-public-data.idc_v5.dicom_metadata` AS dicom
GROUP BY StudyInstanceUID
ORDER BY StudyDateTime DESC
LIMIT 10;

查询会返回以下信息:

  • 最新进入系统的 10 项研究,以及进入系统的时间
  • 与每项研究关联的患者
  • 研究的 UID
  • 与研究关联的实例数

以下响应使用 JSON 格式:

[
  {
    "StudyDateTime": "2021-07-11 00:38:22",
    "PatientID": "C3L-01924",
    "StudyInstanceUID": "1.3.6.1.4.1.5962.99.1.2466232160.763753303.1625963902816.3.0",
    "InstanceCount": "4"
  }, {
    "StudyDateTime": "2021-07-10 23:52:10",
    "PatientID": "C3L-01924",
    "StudyInstanceUID": "1.3.6.1.4.1.5962.99.1.2463459463.1074873794.1625961130119.3.0",
    "InstanceCount": "4"
  }, {
    "StudyDateTime": "2021-07-10 23:31:13",
    "PatientID": "C3L-02513",
    "StudyInstanceUID": "1.3.6.1.4.1.5962.99.1.2462202516.1453336368.1625959873172.3.0",
    "InstanceCount": "7"
  }, {
    "StudyDateTime": "2021-07-10 23:25:17",
    "PatientID": "C3L-01924",
    "StudyInstanceUID": "1.3.6.1.4.1.5962.99.1.2461846936.496969835.1625959517592.3.0",
    "InstanceCount": "4"
  }, {
    "StudyDateTime": "2021-07-10 22:35:16",
    "PatientID": "C3L-02515",
    "StudyInstanceUID": "1.3.6.1.4.1.5962.99.1.2458845347.1905567435.1625956516003.3.0",
    "InstanceCount": "6"
  }, {
    "StudyDateTime": "2021-07-10 21:49:46",
    "PatientID": "C3L-02515",
    "StudyInstanceUID": "1.3.6.1.4.1.5962.99.1.2456116127.1264613559.1625953786783.3.0",
    "InstanceCount": "7"
  }, {
    "StudyDateTime": "2021-07-10 21:46:04",
    "PatientID": "C3L-02513",
    "StudyInstanceUID": "1.3.6.1.4.1.5962.99.1.2455894080.1705479047.1625953564736.3.0",
    "InstanceCount": "6"
  }, {
    "StudyDateTime": "2021-07-10 21:13:30",
    "PatientID": "C3L-01924",
    "StudyInstanceUID": "1.3.6.1.4.1.5962.99.1.2453939652.2052768474.1625951610308.3.0",
    "InstanceCount": "4"
  }, {
    "StudyDateTime": "2021-07-10 21:10:17",
    "PatientID": "C3L-02515",
    "StudyInstanceUID": "1.3.6.1.4.1.5962.99.1.2453746219.164669562.1625951416875.3.0",
    "InstanceCount": "6"
  }, {
    "StudyDateTime": "2021-07-10 20:05:48",
    "PatientID": "C3L-02513",
    "StudyInstanceUID": "1.3.6.1.4.1.5962.99.1.2449877792.1996682667.1625947548448.3.0",
    "InstanceCount": "6"
  }
]

限制和其他行为

如果 DICOM 标记在 BigQuery 中没有受支持的类型(在排除的 VR 中列出),则可能列在目标 BigQuery 表的单独列(名为 DroppedTags.TagName)中,或者可以完全排除。超出大约 1 MB 的 DICOM 标记将被完全排除。

对 DICOM 导出请求进行问题排查

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