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)
  • Universal Resource Identifier(UR) 또는 Universal Resource Locator(URI/URL)
  • 무제한 텍스트(UT)
문자열
날짜(DA) Date
시간(TM) 시간
날짜 시간(DT) 타임스탬프
  • 십진수 문자열(DS)
  • 정수 문자열(IS)
문자열
사람 이름(PN) 구조체(레코드)
  • 부동 소수점 Single(FL)
  • 부동 소수점 Double(FD)
부동 소수점
  • 속성 태그(AT)
  • 부호 있는 Long(SL)
  • 부호 있는 Short(SS)
  • 부호 없는 Long(UL)
  • 부호 없는 Short(US)
정수
항목 시퀀스(SQ) 구조체(레코드)

Null 허용 및 반복 모드

데이터 요소의 값 다양성(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가 포함됩니다. 따라서 BigQuery로 내보낼 때 해당 모드가 REPEATED이면 테이블에 다음과 같이 표시됩니다(JSON으로 표시된 경우).

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

제외된 VR

바이너리 및 긴 형식 데이터는 생성된 BigQuery 테이블로 내보내기가 수행되지 않으므로, 다음 VR을 포함하는 데이터 요소의 내보내기가 수행되지 않습니다. 대신 다음 VR은 대상 BigQuery 테이블의 개별 열(DroppedTags.TagName)에 포함됩니다.

  • Other Double(OD)
  • Other Float(OF)
  • Other Long(OL)
  • Other Byte(OB)
  • Other Word(OW)
  • Unknown(UN)
  • 약 1MiB를 초과하는 데이터가 포함된 Sequence(SQ) 태그
  • Attribute(AT), Floating Point Double(FD), Floating Point Single(FL), Unsigned Long(UL) 또는 Unsigned Short(US)(Value Multiplicity(VM)가 512보다 큰 경우)
    • 기존 이유로, Cloud Healthcare API에 이미 수집된 인스턴스의 태그는 값 다양성(VM)이 64보다 크면 DroppedTags.TagName 열에 포함될 수 있습니다.

사람 이름 VR

하위 열에 데이터가 포함되었는지 여부에 관계없이 사람 이름(PN) VR이 있는 BigQuery 스키마의 각 열에는 항상 3개 하위 열이 포함됩니다. 3개 하위 열은 다음과 같습니다.

  • Alphabetic
  • Ideographic
  • Phonetic

3개 하위 열은 각각 고유한 5개 하위 열을 포함합니다.

  • FamilyName
  • GivenName
  • MiddleName
  • NamePrefix
  • NameSuffix

예를 들어 사람 이름(PN)의 VR을 포함하는 공개 태그 'OperatorsName(0008,1070)'를 고려해보세요. OperatorsName의 값이 'Darcy Smith'라고 가정해보세요. 이 스키마에는 이전에 나열된 하위 열이 있는 OperatorsName 열을 포함하지만, Alphabetic.FamilyName(Smith) 및 Alphabetic.GivenName(Darcy)에만 값이 포함됩니다.

비공개 데이터 요소

일부 임상 구현에서는 공개 데이터 요소의 구조에 맞지 않는 커스텀 데이터를 저장해야 할 수 있습니다. 이 경우에는 대안으로 비공개 데이터 요소를 사용할 수 있습니다.

VR이 SQ(항목 시퀀스)인 비공개 데이터 요소는 동작이 표준 데이터 요소와 동일합니다. VR이 SQ인 비공개 데이터 요소를 비공개 데이터 시퀀스라고 부릅니다.

VR이 SQ가 아닌 비공개 데이터 요소는 OtherElements라는 열 아래에 중첩되고 문자열로 변환됩니다. 이러한 비공개 데이터 요소를 비시퀀스 비공개 데이터 라고 부릅니다. 비시퀀스 비공개 데이터 요소를 쿼리하려면 쿼리가 요소의 OtherElements 열 내에서 검색을 수행해야 합니다.

OtherElements 열에는 'Data' 및 'Tag'라는 두 개의 하위 열이 포함됩니다. Data 열은 비공개 데이터 요소의 값에 대한 문자열 표현입니다. 항상 REPEATED 유형입니다. Tag 열에는 'Tag_HEX' 형식이 사용되며, 여기서 HEX는 태그 번호의 16진수 문자열입니다.

LastUpdatedType

LastUpdatedType 열은 DICOM 메타데이터를 내보낼 때 생성된 BigQuery 테이블에 추가됩니다. 이러한 열은 표준 또는 비공개 데이터 요소가 아니며 DICOM 데이터 요소의 레지스트리에 해당하지 않습니다.

이러한 열의 동작은 다음과 같습니다.

  • LastUpdated 열에는 DICOM 인스턴스가 DICOM 저장소에 삽입되거나 삭제된 시점을 보여주는 타임스탬프 값이 포함됩니다.
  • Type 열에는 발생한 작업 유형을 보여주는 문자열이 포함됩니다. 가능한 값은 CREATE 또는 DELETE입니다.

충돌 및 불일치 유형

공개 태그가 잘못된 유형으로 사용된 경우와 같이 유형 충돌이 발생하면 공개 태그가 마치 비공개 태그인 것처럼 취급됩니다. 데이터 요소의 값은 OtherElements라는 열에 중첩되고 값이 문자열로 변환됩니다.

예를 들어 DICOM 메타데이터에 다음 태그가 포함된다고 가정해보세요.

  • 태그 번호 '(4010,1017)'
  • VR은 SL(부호 있는 Long)
  • 값 32

(4010,1017)은 VR이 FL인 DICOM 사양의 공개 태그 이름인 'Mass"와 동일한 태그 번호입니다. 내보내기 작업에서는 태그 번호가 '(4010,1017)'인 데이터 요소를 VR이 FL인 'Mass' 비공개 태그 이름으로 인식합니다. 따라서 내보내기 작업은 표준 DICOM 데이터 요소 동작의 테이블에 표시된 것처럼 데이터 요소의 값을 float로 변환합니다.

VR이 SL인 태그에는 정수 데이터 유형이 사용되기 때문에 유형 충돌이 발생합니다. 따라서 태그가 비공개 태그로 변환되고 OtherElements 열에 추가됩니다.

비시퀀스 공개 태그 이름이 시퀀스 데이터에 사용된 경우 유형 불일치가 발생합니다. 따라서 비공개 데이터 요소인 것처럼 시퀀스가 처리됩니다. 공개 태그 이름을 BigQuery 스키마에서 열 이름으로 사용하는 대신 공개 태그 이름의 16진수 숫자가 사용됩니다. 16진수 숫자는 문자열 유형입니다.

예: 공개 및 비공개 데이터 요소 쿼리

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 작업에 대해 자세히 알아보고 예시를 확인합니다.