了解 BigQuery DICOM 架构

本页面介绍了在将 DICOM 元数据导出到 BigQuery 时创建的 BigQuery 表的架构。

术语

如需理解架构及其组件,请先熟悉 DICOM 术语。具体来说,本页面使用 3.10 DICOM 数据结构和编码定义中的几个术语。

概览

Cloud Healthcare API 将使用您要导出的数据和 DICOM 字典自动生成 BigQuery 架构。架构仅包含元数据中存在的 DICOM 数据元素的列。唯一的例外是 用户名称 VR

导出 DICOM 元数据时,Cloud Healthcare API 会尝试导出元数据中的所有数据元素。如需了解出现问题时会发生什么,请参阅冲突和不匹配类型

标准和不公开数据元素

DICOM 提供符合预定义规范的标准数据元素。如需查看这些数据元素的列表,请参阅 DICOM 数据元素注册表

如果您必须传达不符合标准元素的数据,可以使用不公开数据元素

标准数据元素

以下行为适用于标准数据元素。如需了解不公开数据元素的行为,请参阅不公开数据元素

列名称

生成的 BigQuery 架构中的列将根据数据元素的关键字命名。例如,如果 DICOM 元数据包含关键字为 InstanceCreationDate 的数据元素,则生成的架构具有名为 InstanceCreationDate 的对应列。

标准 DICOM 数据元素行为

下表显示了值表示法 (VR) 及其缩写列表。对于导出到包含某个 VR 的 BigQuery 的任何数据元素,数据元素会使用“数据类型”下的 BigQuery 数据类型:

VR 数据类型
  • 应用实体 (AE)
  • 年龄字符串 (AS)
  • 代码字符串 (CS)
  • 长字符串 (LO)
  • 长文本 (LT)
  • 短字符串 (SH)
  • 短文本 (ST)
  • 无限制字符 (UC)
  • 唯一标识符 (UI/UID)
  • 通用资源标识符 (UR) 或通用资源定位器(URI/网址)
  • 无限制文本 (UT)
字符串
日期 (DA) 日期
时间 (TM) 时间
日期时间 (DT) 时间戳
  • 十进制字符串 (DS)
  • 整数字符串 (IS)
字符串
用户名称 (PN) 结构体(记录)
  • 单精度浮点 (FL)
  • 双精度浮点 (FD)
浮点
  • 特性标记 (AT)
  • Signed Long (SL)
  • Signed Short (SS)
  • Unsigned Long (UL)
  • Unsigned Short (US)
整数
项目顺序 (SQ) 结构体(记录)

可以为 Null 的重复模式

根据数据元素的 Value Multiplicity (VM) 值,其 BigQuery 列会是以下两种模式之一:NULLABLEREPEATED

如果数据元素的 VM 值为 1,则表示该数据元素是唯一的,且使用 NULLABLE 模式。如果 VM 值为其他值,则数据元素使用 REPEATED 模式。

例如,如 DICOM 数据元素注册表所示,SOPInstanceUID 关键字的 VM 值为 1。因此,在将其导出到 BigQuery 时,其模式为 NULLABLE,其在表中的表示法如下所示(以 JSON 表示):

"SOPInstanceUID": "0.0.000.000000.0.000.0000.0000000.0000.0000000000.000",

相反,ImageType 关键字的 VM 值为 2-n。 因此,在将其导出到 BigQuery 时,其模式为 REPEATED,其在表中的表示法如下所示(以 JSON 表示):

"ImageType": [
  "ORIGINAL",
  "PRIMARY",
  "OTHER",
  "..."
],

排除的 VR

二进制数据不会导出到生成的 BigQuery 表中,因此不导出包含以下 VR 的数据元素。相反,以下 VR 会包含在目标 BigQuery 表的单独列(名为 DroppedTags.TagName)中。

  • 其他 Double (OD)
  • 其他浮点数 (OF)
  • 其他 Long (OL)

以下 VR 未包含在导出的元数据中,也不包含在 DroppedTags.TagName 列中。

  • 其他字节 (OB)
  • 其他 Word (OW)
  • 未知 (UN)

用户名称 VR

无论子列是否包含数据,BigQuery 架构中具有用户名称 (PN) VR 的每一列始终包含三个子列。三个子列包括:

  • 字母
  • 表意文字
  • 拼音

每一个子列都有自己的五个子列:

  • FamilyName
  • GivenName
  • MiddleName
  • NamePrefix
  • NameSuffix

例如,假设公共标记“OperatorsName (0008,1070)”的 VR 为用户名称 (PN)。假设 OperatorsName 的值是“Darcy Smith”。 架构将包含一个 OperatorsName 列,该列包含之前列出的子列,但只有字母、FamilyName (Smith) 和Alphabetic.GivenName (Darcy) 列会包含值。

不公开数据元素

一些临床实现可能需要存储不适合公共数据元素结构的自定义数据。作为替代方案,您可以使用不公开数据元素。

VR 为 SQ(项目序列)的不公开数据元素与标准数据元素具有相同的行为。VR 为 SQ 的不公开数据元素被称为不公开数据序列。

VR 不为 SQ 的不公开数据元素将嵌套在名为 OtherElements 的列下并转换为字符串。这些不公开数据元素被称为非序列不公开数据。如要查询非序列不公开数据元素,您的查询必须在该元素的 OtherElements 列中进行搜索。

OtherElements 列包含两个子列:“数据”和“标记”。数据列是不公开数据元素值的字符串表示形式。始终为 REPEATED 类型。“标记”列采用“Tag_HEX”格式,其中 HEX 是标记编号的十六进制字符串。

LastUpdatedType

LastUpdatedType 列会添加到导出 DICOM 元数据时创建的 BigQuery 表中。这些列不是标准或不公开数据元素,而且它们不对应于 DICOM 数据元素的注册表。

这些列的行为如下:

  • LastUpdated 列包含一个时间戳值,该值显示 DICOM 实例在 DICOM 存储区中插入或删除的时间。
  • Type 列包含一个字符串,用于显示发生的操作类型。可能的值为 CREATEDELETE

冲突和不匹配的类型

如果发生类型冲突,例如,当公共标记使用不正确的类型时,该公共标记会被视为不公开标记。数据元素的值嵌套在名为 OtherElements 的列下,且该值会转换为字符串。

例如,假设 DICOM 元数据包含带有以下内容的标记:

  • 标记编号“(4010,1017)”
  • VR 为 SL (Signed Long)
  • 值为 32

(4010,1017)是与“Mass”相同的标记号,“Mass”是 DICOM规范中的一个公开标签名,其 VR 为 FL。导出操作要求标记编号为“(4010,1017)”的数据元素,该数据具有 VR 是 FL 的“Mass”公共标记名称。因此,导出操作期望将数据元素的值转换为浮点数(如标准 DICOM 数据元素行为表中所示)。

发生类型冲突是因为 VR 为 SL 所有标记都使用整数数据类型。因此,该标记将转换为不公开标记,并添加到 OtherElements 列中。

如果序列数据使用非序列的公共标记名称,则会出现类型不匹配。因此,该序列会被视为一个不公开数据元素。在 BigQuery 架构中不使用公共标记名称作为列名,而是使用公共标记名称的十六进制编号。十六进制数字是类型字符串。

示例:查询公共和不公开数据元素

请考虑以下表示为 JSON 的架构片段。架构是在将 DICOM 数据导出到 BigQuery 之后创建的。

[
  ...
  {
    "name": "SOPInstanceUID",
    "type": "STRING"
  },
  {
    "fields": [
      {
        "fields": [
          {
            "mode": "REQUIRED",
            "name": "Tag",
            "type": "STRING"
          },
          {
            "mode": "REPEATED",
            "name": "Data",
            "type": "STRING"
          }
        ],
        "mode": "REPEATED",
        "name": "OtherElements",
        "type": "RECORD"
      }
    ],
    "mode": "REPEATED",
    "name": "Tag_12345678",
    "type": "RECORD"
  }
  ...
]

以下示例展示了如何查询 SOPInstanceUID 公开数据元素。如要访问列的值,请运行以下查询:

#standardSQL
SELECT
  SOPInstanceUID
FROM
  `PROJECT_ID.DATASET_ID.TABLE_ID`

运行查询会返回类似于以下内容的输出:

[
  ...
  {
    "SOPInstanceUID": "0.0.000.000000.0.000.0000.0000000.0000.0000000000.000"
  },
  ...
]

以下示例展示了如何查询非序列不公开数据。对 Tag_12345678 列内的 OtherElements 列运行以下查询。请注意:在查询 RECORD 时必须使用 UNNEST 运算符。

#standardSQL
SELECT
  Tag_12345678.OtherElements AS OtherElements
FROM
  `PROJECT_ID.DATASET_ID.TABLE_ID`,
  UNNEST(Tag_12345678) AS Tag_12345678

运行查询会返回类似于以下内容的输出,具体取决于 Tag_12345678.OtherElements 列中的数据量和类型:

[
  {
    "OtherElements": [
      {
        "Tag": "Tag_12345678",
        "Data": [
          "DATA"
        ]
      }
    ]
  },
  {
    "OtherElements": [
      {
        "Tag": "Tag_12345678",
        "Data": [
          "DATA"
        ]
      }
    ]
  },
  {
    "OtherElements": [
      {
        "Tag": "Tag_12345678",
        "Data": [
          "DATA"
        ]
      }
    ]
  }
]

后续步骤

了解更多关于 BigQuery 标准 SQL 操作和视图示例的信息。