瞭解 BigQuery DICOM 結構定義

本頁說明將 DICOM 中繼資料匯出至 BigQuery時,所建立的 BigQuery 資料表架構。

術語

如要瞭解結構定義及其元件,請先熟悉 DICOM 術語。本頁面特別使用 3.10 DICOM 資料結構和編碼定義 中的幾個詞彙。

總覽

Cloud Healthcare API 會使用您匯出的資料和 DICOM 字典,自動產生 BigQuery 結構定義。此架構只包含中繼資料中 DICOM 資料元素的資料欄。唯一的例外狀況是Person Name VR

匯出 DICOM 中繼資料時,Cloud Healthcare API 會嘗試匯出中繼資料中的所有資料元素。如要瞭解發生問題時會發生什麼情況,請參閱「相衝突和不相符的類型」。

標準和私人資料元素

DICOM 提供符合預先定義規格的標準資料元素。如需這些資料元素的清單,請參閱「DICOM 資料元素註冊表」。

如果您必須傳送不符合標準元素的資料,可以使用私人資料元素

標準資料元素

以下行為適用於標準資料元素。如要瞭解私人資料元素的行為,請參閱「私人資料元素」。

欄名稱

產生的 BigQuery 結構定義中的資料欄會根據資料元素的關鍵字命名。舉例來說,如果 DICOM 中繼資料包含關鍵字為 InstanceCreationDate 的資料元素,則產生的結構定義會有對應的資料欄,名稱為 InstanceCreationDate。

標準 DICOM 資料元素行為

下表列出值表示法 (VR) 及其縮寫。對於匯出至 BigQuery 的任何資料元素,如果包含其中一個 VR,則資料元素會使用「資料類型」下方的 BigQuery 資料類型:

VR 資料類型
  • 應用程式實體 (AE)
  • 年齡字串 (AS)
  • 程式碼字串 (CS)
  • 長字串 (LO)
  • 詳細文字 (LT)
  • 短字串 (SH)
  • 簡短文字 (ST)
  • 無限字元 (UC)
  • 專屬 ID (UI/UID)
  • 通用資源 ID (UR) 或通用資源定位器 (URI/網址)
  • 無限文字 (UT)
字串
日期 (DA) 日期
時間 (TM) 時間
日期時間 (DT) 時間戳記
  • 十進制字串 (DS)
  • 整數字串 (IS)
字串
人名 (PN) 結構 (記錄)
  • 單精浮點 (FL)
  • 浮點雙精度 (FD)
浮點
  • 屬性標記 (AT)
  • 已簽署的長整數 (SL)
  • 有符號的短整數 (SS)
  • Unsigned Long (UL)
  • Unsigned Short (美國)
整數
項目序列 (SQ) 結構 (記錄)

可為空值和重複模式

視資料元素的值多重度 (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 的資料元素。相反地,目的地 BigQuery 資料表會在名為 DroppedTags.TagName 的獨立資料欄中納入下列 VR。

  • 其他雙精度浮點數 (OD)
  • 其他浮動 (OF)
  • 其他長篇 (OL)
  • 其他位元組 (OB)
  • 其他字詞 (OW)
  • 不明 (UN)
  • 序列 (SQ) 代碼含有超過約 1 MiB 的資料
  • 屬性 (AT)、浮點雙精度 (FD)、浮點單精度 (FL)、無符號長整數 (UL) 或無符號短整數 (US),如果值多重度 (VM) 大於 512。
    • 基於舊版原因,如果值倍數大於 64,已擷取至 Cloud Healthcare API 的例項標記可能會列入 DroppedTags.TagName 欄。

Person Name VR

無論子欄是否包含任何資料,具有 Person Name (PN) VR 的 BigQuery 結構定義中的每個欄都會一律包含三個子欄。三個子欄為:

  • 字母順序
  • 表意文字
  • 拼音

三個子欄各有五個子欄:

  • FamilyName
  • GivenName
  • MiddleName
  • NamePrefix
  • NameSuffix

舉例來說,請考慮「OperatorsName (0008,1070)」這個公開標記,其 VR 為「Person Name (PN)」。假設「OperatorsName」的值為「Darcy Smith」。架構會包含 OperatorsName 欄,其中包含先前列出的子欄,但只有 Alphabetic.FamilyName (Smith) 和 Alphabetic.GivenName (Darcy) 會包含值。

私人資料元素

某些臨床實作可能需要您儲存不符合公開資料元素結構的自訂資料。您也可以改用私人資料元素。

私人資料元素的 VR 為 SQ (項目序列),其行為與標準資料元素相同。具有 SQ 虛擬實體的私人資料元素稱為私人資料序列

私人資料元素如果沒有 SQ 的 VR,就會在名為 OtherElements 的資料欄下方巢狀,並轉換為字串。這些私人資料元素稱為非序列私人資料。如要查詢非序列的私人資料元素,查詢必須在元素的 OtherElements 欄中搜尋。

OtherElements 欄包含兩個子欄:「資料」和「標記」。「資料」欄是私人資料元素值的字串表示法。一律為 REPEATED 類型。「Tag」欄的格式為「Tag_HEX」,其中 HEX 是代碼號碼的十六進位字串。

LastUpdatedType

匯出 DICOM 中繼資料時,系統會將 LastUpdatedType 欄位新增至 BigQuery 資料表。這些欄並非標準或私人資料元素,也不對應至 DICOM 資料元素註冊表。

這些資料欄的行為如下:

  • LastUpdated 欄包含時間戳記值,顯示 DICOM 例項何時插入或從 DICOM 儲存庫中刪除。
  • Type 欄包含字串,顯示發生的運算類型。可能的值為 CREATEDELETE

衝突和不相符的類型

如果發生類型衝突 (例如使用公開標記的類型不正確),系統會將公開標記視為私人標記。資料元素的值會巢狀在名為 OtherElements 的資料欄下方,且值會轉換為字串。

舉例來說,假設 DICOM 中繼資料包含以下標記:

  • 標籤編號「(4010,1017)」
  • SL (Signed Long) 的 VR
  • 值為 32

(4010,1017) 與「Mass」的標記編號相同,這是 DICOM 規格中的公開標記名稱,其 VR 為 FL。匯出作業預期標記編號為「(4010,1017)」的資料元素,會是「Mass」公開標記名稱,且 VR 為 FL。因此,匯出作業會將資料元素的值轉換為浮點值 (如「標準 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 欄執行以下查詢。請注意,您必須使用 UNNEST 運算子,因為您要查詢 RECORD

#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 作業,並查看範例。