将 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 标志(使用 gcloud 命令行工具)
  • 您是否已设置 writeDisposition 枚举的值。如果使用 writeDisposition 枚举,请勿设置 force 字段。
上述每种情况下的行为如下:
  • 如果目标表已存在且 force 设置为 true 或指定了 --overwrite-table 标志,则导出操作将覆盖现有表。
  • 如果目标表已存在且 force 设置为 false 或未指定 --overwrite-table 标志,则会发生错误。
  • 如果目标表尚不存在,则无论您指定 force 字段还是 --overwrite-table 标志,都会创建新表。
  • 如需了解 writeDisposition 描述的行为,请参阅其文档。使用 force 时,writeDisposition 枚举执行类似于选项的行为,但存在以下例外情况:如果目标表已存在且为空,则导出操作会完成,而不是返回错误。

导出 DICOM 元数据

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

控制台

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

  1. 在 Cloud Console 中,转到数据集页面。
    转到“数据集”页面
  2. 点击包含您要从中导出 DICOM 元数据的 DICOM 存储区的数据集。
  3. 在数据存储区列表中,从 DICOM 存储区的操作列表中选择导出
  4. 在显示的导出 DICOM 存储区页面上,选择 BigQuery 表
  5. 项目列表中,选择 BigQuery 项目。
  6. 数据集 ID 列表中,选择数据集。
  7. 表名称字段中,输入新表名称。
    BigQuery 会检查每项选择,以确保目标表有效。
  8. 点击导出,将 DICOM 元数据导出到 BigQuery 中定义的目标位置。
  9. 要跟踪操作的状态,请点击操作标签页。操作完成后,系统会显示以下指示:
    • 长时间运行的操作状态部分下方的确定标题下会显示一个绿色的对勾标记。
    • 概览部分在操作 ID 的同一行中显示一个绿色对勾标记和一个确定指示符。
    如果您遇到任何错误,请点击操作,然后点击在 Cloud Logging 中查看详细信息

gcloud

要将 DICOM 元数据导出到 BigQuery,请使用 gcloud healthcare dicom-stores export bq 命令。请指定以下信息:

  • 父数据集的名称
  • DICOM 存储区的名称
  • 现有 BigQuery 数据集的名称
  • BigQuery Export 表的名称。名称只能包含字母(大写或小写)、数字和下划线。如需了解如何自定义导出操作的行为,请参阅设置 BigQuery 目标位置

以下示例展示了 gcloud dicom-stores export bq 命令。

gcloud healthcare dicom-stores export bq DICOM_STORE_ID \
  --dataset=DATASET_ID \
  --location=LOCATION \
  --bq-table=bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID \
  [--overwrite-table]

运行该命令后,它会返回操作名称:

name: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID

如需详细了解该操作,请运行 gcloud healthcare operations describe 命令并从响应中提供 OPERATION_ID

gcloud healthcare operations describe OPERATION_ID \
  --dataset=DATASET_ID

操作完成后,响应中将包含 done: true

done: true
metadata:
  '@type': type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata
  apiMethodName: google.cloud.healthcare.v1.dicom.DicomService.ExportDicomData
  createTime: 'CREATE_TIME'
  endTime: 'END_TIME'
name: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID
response:
  '@type': '...'

API

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

curl

要导出 DICOM 元数据,请发出 POST 请求并指定以下信息:

  • 父级数据集的名称和位置
  • DICOM 存储区的名称
  • 现有 BigQuery 数据集的名称
  • BigQuery Export 表的名称。名称只能包含字母(大写或小写)、数字和下划线。如需了解如何自定义导出操作的行为,请参阅设置 BigQuery 目标位置
  • writeDisposition 枚举的以下某个值:
    • WRITE_EMPTY:仅在目标表为空时才导出数据。这是默认的。
    • WRITE_TRUNCATE:在写入实例之前清空表中的所有现有数据。
    • WRITE_APPEND:将数据附加到现有表。

以下示例展示了使用 curlPOST 请求。

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    --data "{
      'bigqueryDestination': {
        'tableUri': 'bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID'
      },
      'writeDisposition': '{WRITE_EMPTY|WRITE_TRUNCATE|WRITE_APPEND}'
    }" "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID:export"

如果请求成功,服务器将以 JSON 格式返回响应:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
}

响应包含操作名称。要跟踪操作的状态,您可以使用 Operation get 方法

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

如果请求成功,服务器将以 JSON 格式返回包含操作状态的响应:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1.dicom.DicomService.ExportDicomData",
    "createTime": "CREATE_TIME",
    "endTime": "END_TIME",
    "logsUrl": "https://console.cloud.google.com/logs/viewer/CLOUD_LOGGING_URL"
  },
  "done": true,
  "response": {
    "@type": "..."
  }
}

PowerShell

要导出 DICOM 元数据,请发出 POST 请求并指定以下信息:

  • 父级数据集的名称和位置
  • DICOM 存储区的名称
  • 现有 BigQuery 数据集的名称
  • BigQuery Export 表的名称。名称只能包含字母(大写或小写)、数字和下划线。如需了解如何自定义导出操作的行为,请参阅设置 BigQuery 目标位置
  • writeDisposition 枚举的以下某个值:
    • WRITE_EMPTY:仅在目标表为空时才导出数据。这是默认的。
    • WRITE_TRUNCATE:在写入实例之前清空表中的所有现有数据。
    • WRITE_APPEND:将数据附加到现有表。

以下示例展示了使用 Windows PowerShell 的 POST 请求。

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

Invoke-WebRequest `
  -Method Post `
  -Headers $headers `
  -ContentType: "application/json; charset=utf-8" `
  -Body "{
    'bigqueryDestination': {
      'tableUri': 'bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID'
    },
    'writeDisposition': '{WRITE_EMPTY|WRITE_TRUNCATE|WRITE_APPEND}'
  }" `
  -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID:export" | Select-Object -Expand Content

如果请求成功,服务器将以 JSON 格式返回响应:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
}

响应包含操作名称。要跟踪操作的状态,您可以使用 Operation get 方法

$cred = gcloud auth application-default 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

如果请求成功,服务器将以 JSON 格式返回包含操作状态的响应:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1.dicom.DicomService.ExportDicomData",
    "createTime": "CREATE_TIME",
    "endTime": "END_TIME",
    "logsUrl": "https://console.cloud.google.com/logs/viewer/CLOUD_LOGGING_URL"
  },
  "done": true,
  "response": {
    "@type": "..."
  }
}

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

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

gcloud

要将 DICOM 元数据从一个项目中的 DICOM 存储区导出到另一个项目中的 BigQuery 表,请使用 gcloud healthcare dicom-stores export bq 命令。请指定以下信息:

  • 父数据集的名称
  • DICOM 存储区的名称
  • 目标项目
  • 目标项目中现有 BigQuery 数据集的名称
  • BigQuery Export 表的名称。名称只能包含字母(大写或小写)、数字和下划线。如需了解 Cloud Healthcare API 如何将数据写入 BigQuery 表,请参阅设置 BigQuery 目标位置

以下示例展示了 gcloud dicom-stores export bq 命令。

gcloud healthcare dicom-stores export bq DICOM_STORE_ID \
  --dataset=DATASET_ID \
  --location=LOCATION \
  --bq-table=bq://DESTINATION_PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID \
  [--overwrite-table]

命令行会显示操作 ID,操作完成后,done

Request issued for: [DICOM_STORE_ID]
Waiting for operation [projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/OPERATION_ID] to complete...done.
name: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID

如需详细了解该操作,请运行 gcloud healthcare operations describe 命令并从响应中提供 OPERATION_ID

gcloud healthcare operations describe OPERATION_ID \
  --dataset=DATASET_ID

操作完成后,响应中将包含 done: true

done: true
metadata:
  '@type': type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata
  apiMethodName: google.cloud.healthcare.v1.dicom.DicomService.ExportDicomData
  createTime: 'CREATE_TIME'
  endTime: 'END_TIME'
name: projects/SOURCE_PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID
response:
  '@type': '...'

API

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

curl

要将 DICOM 元数据从一个项目中的 DICOM 存储区导出到另一个项目中的 BigQuery 表,请发出 POST 请求并指定以下信息:

  • 来源项目
  • 父级数据集的名称和位置
  • DICOM 存储区的名称
  • 目标项目
  • 目标项目中现有 BigQuery 数据集的名称
  • BigQuery Export 表的名称。名称只能包含字母(大写或小写)、数字和下划线。如需了解 Cloud Healthcare API 如何将数据写入 BigQuery 表,请参阅设置 BigQuery 目标位置
  • writeDisposition 枚举的以下某个值:
    • WRITE_EMPTY:仅在目标表为空时才导出数据。这是默认的。
    • WRITE_TRUNCATE:在写入实例之前清空表中的所有现有数据。
    • WRITE_APPEND:将数据附加到现有表。

以下示例展示了使用 curlPOST 请求。

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    --data "{
      'bigqueryDestination': {
        'tableUri': 'bq://DESTINATION_PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID'
      },
      'writeDisposition': '{WRITE_EMPTY|WRITE_TRUNCATE|WRITE_APPEND}'
    }" "https://healthcare.googleapis.com/v1/projects/SOURCE_PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID:export"

如果请求成功,服务器将以 JSON 格式返回响应:

{
  "name": "projects/SOURCE_PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
}

响应包含操作名称。要跟踪操作的状态,您可以使用 Operation get 方法

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/SOURCE_PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

如果请求成功,服务器将以 JSON 格式返回包含操作状态的响应:

{
  "name": "projects/SOURCE_PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1.dicom.DicomService.ExportDicomData",
    "createTime": "CREATE_TIME",
    "endTime": "END_TIME",
    "logsUrl": "https://console.cloud.google.com/logs/viewer/CLOUD_LOGGING_URL"
  },
  "done": true,
  "response": {
    "@type": "..."
  }
}

PowerShell

要将 DICOM 元数据从一个项目中的 DICOM 存储区导出到另一个项目中的 BigQuery 表,请发出 POST 请求并指定以下信息:

  • 来源项目
  • 父级数据集的名称和位置
  • DICOM 存储区的名称
  • 目标项目
  • 目标项目中现有 BigQuery 数据集的名称
  • BigQuery Export 表的名称。名称只能包含字母(大写或小写)、数字和下划线。如需了解 Cloud Healthcare API 如何将数据写入 BigQuery 表,请参阅设置 BigQuery 目标位置
  • writeDisposition 枚举的以下某个值:
    • WRITE_EMPTY:仅在目标表为空时才导出数据。这是默认的。
    • WRITE_TRUNCATE:在写入实例之前清空表中的所有现有数据。
    • WRITE_APPEND:将数据附加到现有表。

以下示例展示了使用 Windows PowerShell 的 POST 请求。

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

Invoke-WebRequest `
  -Method Post `
  -Headers $headers `
  -ContentType: "application/json; charset=utf-8" `
  -Body "{
    'bigqueryDestination': {
      'tableUri': 'bq://DESTINATION_PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID'
    },
    'writeDisposition': '{WRITE_EMPTY|WRITE_TRUNCATE|WRITE_APPEND}'
  }" `
  -Uri "https://healthcare.googleapis.com/v1/projects/SOURCE_PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID:export" | Select-Object -Expand Content

如果请求成功,服务器将以 JSON 格式返回响应:

{
  "name": "projects/SOURCE_PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
}

响应包含操作名称。要跟踪操作的状态,您可以使用 Operation get 方法

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

Invoke-WebRequest `
  -Method Get `
  -Headers $headers `
  -Uri "https://healthcare.googleapis.com/v1/projects/SOURCE_PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content

如果请求成功,服务器将以 JSON 格式返回包含操作状态的响应:

{
  "name": "projects/SOURCE_PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1.dicom.DicomService.ExportDicomData",
    "createTime": "CREATE_TIME",
    "endTime": "END_TIME",
    "logsUrl": "https://console.cloud.google.com/logs/viewer/CLOUD_LOGGING_URL"
  },
  "done": true,
  "response": {
    "@type": "..."
  }
}

使用过滤条件导出 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 PATH/TO/FILTER_FILE gs://BUCKET/DIRECTORY

传入过滤条件文件

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

gcloud

如需使用过滤条件将 DICOM 元数据导出到 BigQuery,请使用 gcloud beta healthcare dicom-stores export bq 命令:

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

请替换以下内容:

  • DICOM_STORE_ID:DICOM 存储区的标识符
  • DATASET_ID:DICOM 存储区的父级数据集的名称
  • LOCATION:DICOM 存储区的父级数据集的位置
  • PROJECT_ID:包含 BigQuery 数据集的项目标识符
  • BIGQUERY_DATASET_ID:BigQuery 数据集的名称
  • BIGQUERY_TABLE_ID:BigQuery Export 表的名称。名称只能包含字母(大写或小写)、数字和下划线。如需了解 Cloud Healthcare API 如何将数据写入 BigQuery 表,请参阅设置 BigQuery 目标位置
  • BUCKET/DIRECTORY/FILTER_FILE:过滤条件文件在 Cloud Storage 存储分区中的位置

输出如下所示:

Request issued for: [DICOM_STORE_ID]
Waiting for operation [projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID] to complete...done.
name: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID

如需查看操作的状态,请运行 gcloud healthcare operations describe 命令并从响应中提供 OPERATION_ID

gcloud healthcare operations describe OPERATION_ID \
  --location=LOCATION \
  --dataset=DATASET_ID

请替换以下内容:

  • OPERATION_ID:从上一条响应中返回的 ID 编号
  • DATASET_ID:DICOM 存储区的父级数据集的名称
  • LOCATION:DICOM 存储区的父级数据集的位置

输出如下所示:

done: true
metadata:
  '@type': type.googleapis.com/google.cloud.healthcare.v1beta1.OperationMetadata
  apiMethodName: google.cloud.healthcare.v1beta1.dicom.DicomService.ExportDicomData
  createTime: 'CREATE_TIME'
  endTime: 'END_TIME',
  logsUrl: 'https://console.cloud.google.com/logs/viewer/CLOUD_LOGGING_URL'
name: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID
response:
  '@type': '...'

API

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

curl

如需使用过滤条件导出 DICOM 元数据,请发出 POST 请求并指定以下信息:

  • 父级数据集的名称和位置
  • DICOM 存储区的名称
  • 过滤条件文件在 Cloud Storage 存储分区中的位置
  • BigQuery Export 表的名称。名称只能包含字母(大写或小写)、数字和下划线。如需了解 Cloud Healthcare API 如何将数据写入 BigQuery 表,请参阅设置 BigQuery 目标位置
  • writeDisposition 枚举的以下某个值:
    • WRITE_EMPTY:仅在目标表为空时才导出数据。这是默认的。
    • WRITE_TRUNCATE:在写入实例之前清空表中的所有现有数据。
    • WRITE_APPEND:将数据附加到现有表。

以下示例展示了使用 curlPOST 请求。

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    --data "{
      'bigqueryDestination': {
        'tableUri': 'bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID'
      },
      'filterConfig': {
        'resourcePathsGcsUri': 'gs://BUCKET/DIRECTORY/FILTER_FILE'
      },
      'writeDisposition': '{WRITE_EMPTY|WRITE_TRUNCATE|WRITE_APPEND}'
    }" "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID:export"

如果请求成功,服务器将以 JSON 格式返回响应:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
}

响应包含操作名称。要跟踪操作的状态,您可以使用 Operation get 方法

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

如果请求成功,服务器将以 JSON 格式返回包含操作状态的响应:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1beta1.dicom.DicomService.ExportDicomData",
    "createTime": "CREATE_TIME",
    "endTime": "END_TIME",
    "logsUrl": "https://console.cloud.google.com/logs/viewer/CLOUD_LOGGING_URL"
  },
  "done": true,
  "response": {
    "@type": "..."
  }
}

PowerShell

如需使用过滤条件导出 DICOM 元数据,请发出 POST 请求并指定以下信息:

  • 父级数据集的名称和位置
  • DICOM 存储区的名称
  • 过滤条件文件在 Cloud Storage 存储分区中的位置
  • BigQuery Export 表的名称。名称只能包含字母(大写或小写)、数字和下划线。如需了解 Cloud Healthcare API 如何将数据写入 BigQuery 表,请参阅设置 BigQuery 目标位置
  • writeDisposition 枚举的以下某个值:
    • WRITE_EMPTY:仅在目标表为空时才导出数据。这是默认的。
    • WRITE_TRUNCATE:在写入实例之前清空表中的所有现有数据。
    • WRITE_APPEND:将数据附加到现有表。

以下示例展示了使用 Windows PowerShell 的 POST 请求。

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

Invoke-WebRequest `
  -Method Post `
  -Headers $headers `
  -ContentType: "application/json; charset=utf-8" `
  -Body "{
    'bigqueryDestination': {
      'tableUri': 'bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID'
    },
    'filterConfig': {
      'resourcePathsGcsUri': 'gs://BUCKET/DIRECTORY/FILTER_FILE'
    },
    'writeDisposition': '{WRITE_EMPTY|WRITE_TRUNCATE|WRITE_APPEND}'
  }" `
  -Uri "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID:export" | Select-Object -Expand Content

如果请求成功,服务器将以 JSON 格式返回响应:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
}

响应包含操作名称。要跟踪操作的状态,您可以使用 Operation get 方法

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

Invoke-WebRequest `
  -Method Get `
  -Headers $headers `
  -Uri "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content

如果请求成功,服务器将以 JSON 格式返回包含操作状态的响应:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1beta1.dicom.DicomService.ExportDicomData",
    "createTime": "CREATE_TIME",
    "endTime": "END_TIME",
    "logsUrl": "https://console.cloud.google.com/logs/viewer/CLOUD_LOGGING_URL"
  },
  "done": true,
  "response": {
    "@type": "..."
  }
}

在 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 LungCT-Diagnosis 数据集中的 chc-tcia:lungct_diagnosis.lungct_diagnosis 表。

#standardSQL
SELECT MIN(CONCAT(StudyDate, ' ', StudyTime)) as StudyDateTime, MIN(PatientID) as PatientID, StudyInstanceUID, COUNT(*) as InstanceCount
FROM `chc-tcia.lungct_diagnosis.lungct_diagnosis`
GROUP BY StudyInstanceUID
ORDER BY StudyDateTime DESC
LIMIT 20;

查询会返回以下信息:

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

以下响应使用 JSON 格式:

[
  {
    "StudyDateTime": "1998-09-24 07:59:11",
    "PatientID": "R_006",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.203059346048546067166621241946",
    "InstanceCount": "130"
  },
  {
    "StudyDateTime": "1998-09-19 15:02:00",
    "PatientID": "R_168",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.339960057327890022720983572187",
    "InstanceCount": "73"
  },
  {
    "StudyDateTime": "1998-09-03 13:59:23",
    "PatientID": "R_232",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.339835546587977846672632754158",
    "InstanceCount": "74"
  },
  {
    "StudyDateTime": "1998-08-20 09:54:23",
    "PatientID": "R_210",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.296738593990263872210071427126",
    "InstanceCount": "108"
  },
  {
    "StudyDateTime": "1998-08-17 15:22:14",
    "PatientID": "R_053",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.517417975270684537124932347957",
    "InstanceCount": "104"
  },
  {
    "StudyDateTime": "1998-08-03 08:53:02",
    "PatientID": "R_043",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.227672022111453893046049224932",
    "InstanceCount": "111"
  },
  {
    "StudyDateTime": "1998-07-24 10:01:17",
    "PatientID": "R_141",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.179196140853257709306370614304",
    "InstanceCount": "110"
  },
  {
    "StudyDateTime": "1998-06-29 09:18:16",
    "PatientID": "R_069",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.272642986942028254801481747252",
    "InstanceCount": "118"
  },
  {
    "StudyDateTime": "1998-06-27 12:47:58",
    "PatientID": "R_233",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.681962696010777092272412255441",
    "InstanceCount": "65"
  },
  {
    "StudyDateTime": "1998-06-13 11:25:35",
    "PatientID": "R_075",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.905893527127370577828717624475",
    "InstanceCount": "112"
  },
  {
    "StudyDateTime": "1998-06-06 12:16:24",
    "PatientID": "R_029",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.125721920632162119492941634336",
    "InstanceCount": "109"
  },
  {
    "StudyDateTime": "1998-04-30 10:52:34",
    "PatientID": "R_116",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.140526923029511055644251155499",
    "InstanceCount": "115"
  },
  {
    "StudyDateTime": "1998-04-11 08:55:15",
    "PatientID": "R_014",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.231039938881330096566986102847",
    "InstanceCount": "76"
  },
  {
    "StudyDateTime": "1998-04-06 13:48:50",
    "PatientID": "R_061",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.148444392206166653380348096858",
    "InstanceCount": "70"
  },
  {
    "StudyDateTime": "1998-04-05 12:57:54",
    "PatientID": "R_126",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.803397998355063686023109438391",
    "InstanceCount": "71"
  },
  {
    "StudyDateTime": "1998-03-21 13:23:15",
    "PatientID": "R_093",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.201986527949877334068747060981",
    "InstanceCount": "65"
  },
  {
    "StudyDateTime": "1998-03-06 13:27:51",
    "PatientID": "R_065",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.233872568071694592857630274388",
    "InstanceCount": "69"
  },
  {
    "StudyDateTime": "1998-03-06 09:09:43",
    "PatientID": "R_191",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.243097352990517043299166705830",
    "InstanceCount": "76"
  },
  {
    "StudyDateTime": "1998-01-14 14:59:23",
    "PatientID": "R_237",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.213658277730427015624893071198",
    "InstanceCount": "68"
  },
  {
    "StudyDateTime": "1998-01-02 14:00:00",
    "PatientID": "R_078",
    "StudyInstanceUID": "1.3.6.1.4.1.14519.5.2.1.4320.5030.200669196334798686049957852894",
    "InstanceCount": "87"
  }
]

限制和其他行为

如果 DICOM 标记在 BigQuery 中不受支持(在排除的 VR 中列出),则 DICOM 标记将列在目标 BigQuery 表的单独列中(称为 DroppedTags.TagName)。

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

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