本页面介绍了在将 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 | 数据类型 |
---|---|
|
字符串 |
日期 (DA) | 日期 |
时间 (TM) | 时间 |
日期时间 (DT) | 时间戳 |
|
字符串 |
用户名称 (PN) | 结构体(记录) |
|
浮点 |
|
整数 |
项目顺序 (SQ) | 结构体(记录) |
可以为 Null 的重复模式
根据数据元素的 Value Multiplicity (VM) 值,其 BigQuery 列会是以下两种模式之一:NULLABLE
或 REPEATED
。
如果数据元素的 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 是标记编号的十六进制字符串。
LastUpdated
和 Type
列
LastUpdated
和 Type
列会添加到导出 DICOM 元数据时创建的 BigQuery 表中。这些列不是标准或不公开数据元素,而且它们不对应于 DICOM 数据元素的注册表。
这些列的行为如下:
LastUpdated
列包含一个时间戳值,该值显示 DICOM 实例在 DICOM 存储区中插入或删除的时间。Type
列包含一个字符串,用于显示发生的操作类型。可能的值为CREATE
或DELETE
。
冲突和不匹配的类型
如果发生类型冲突,例如,当公共标记使用不正确的类型时,该公共标记会被视为不公开标记。数据元素的值嵌套在名为 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 操作和视图示例的信息。