BigQuery에 DICOM 메타데이터 내보내기

이 페이지에서는 탐색 및 분석을 위해 DICOM 메타데이터를 BigQuery로 내보내는 방법을 설명합니다. DICOM 메타데이터를 내보낼 때 생성되는 BigQuery 스키마에 대한 자세한 내용은 BigQuery DICOM 스키마 이해를 참조하세요.

BigQuery 권한 설정

DICOM 메타데이터를 BigQuery로 내보내기 전에 Cloud Healthcare 서비스 에이전트 서비스 계정에 추가 권한을 부여해야 합니다. 자세한 내용은 DICOM 저장소 BigQuery 권한을 참조하세요.

BigQuery 대상 설정

BigQuery 대상을 설정할 때 다음과 같이 정규화된 URI를 사용합니다.
bq://PROJECT_ID.BIGQUERY_DATASET_ID.BIGQUERY_TABLE_ID
내보내기 작업의 동작은 다음에 따라 달라질 수 있습니다.
  • 대상 테이블이 존재하는지 여부
  • force 필드(API 사용) 또는 --overwrite-table 플래그(gcloud 명령줄 도구 사용) 설정 여부
  • writeDisposition 열거형 값을 설정했는지 여부. writeDisposition enum을 사용하는 경우 force 필드를 설정하지 마세요.
이러한 각 경우의 동작은 다음과 같습니다.
  • 대상 테이블이 존재하고 forcetrue로 설정되었거나 --overwrite-table 플래그가 지정되었으면 내보내기 작업이 기존 테이블을 덮어씁니다.
  • 대상 테이블이 존재하고 forcefalse로 설정되었거나 --overwrite-table 플래그가 지정되지 않았으면 오류가 발생합니다.
  • 대상 테이블이 아직 존재하지 않으면 force 필드 또는 --overwrite-table 플래그를 지정했는지 여부와 관계없이 새 테이블이 생성됩니다.
  • writeDisposition의 동작은 관련 문서를 참조하세요. writeDisposition 열거형은 force를 사용할 때 옵션과 유사한 동작을 수행합니다. 단, 대상 테이블이 이미 있고 비어 있는 경우 내보내기 작업이 오류를 반환하는 대신 완료됩니다.

DICOM 메타데이터 내보내기

다음 샘플은 DICOM 메타데이터를 BigQuery 테이블로 내보내는 방법을 보여줍니다. 이 샘플에서 DICOM 저장소 및 BigQuery 테이블은 동일한 프로젝트에 있습니다. DICOM 메타데이터를 다른 프로젝트로 내보내려면 DICOM 메타데이터를 다른 프로젝트로 내보내기를 참조하세요.

Console

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: 기존 테이블에 데이터를 추가합니다.

다음 샘플은 curl을 사용하는 POST 요청을 보여줍니다.

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"
}

응답에 작업 이름이 포함됩니다. 작업 상태를 추적하려면 작업 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"
}

응답에 작업 이름이 포함됩니다. 작업 상태를 추적하려면 작업 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 저장소에서 다른 프로젝트의 BigQuery 테이블로 DICOM 메타데이터를 내보내려면 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 저장소에서 다른 프로젝트의 BigQuery 테이블로 DICOM 메타데이터를 내보내려면 POST 요청을 수행하고 다음 정보를 지정합니다.

  • 소스 프로젝트
  • 상위 데이터 세트의 이름 및 위치
  • DICOM 저장소의 이름
  • 대상 프로젝트
  • 대상 프로젝트의 기존 BigQuery 데이터 세트 이름
  • BigQuery Export 테이블의 이름입니다. 이름에는 문자(대문자 또는 소문자), 숫자, 밑줄만 사용할 수 있습니다. Cloud Healthcare API가 BigQuery 테이블에 데이터를 기록하는 방법에 대한 설명은 BigQuery 대상 설정을 참조하세요.
  • writeDisposition 열거형에 대한 다음 값 중 하나:
    • WRITE_EMPTY: 대상 테이블이 비어 있는 경우에만 데이터를 내보냅니다. 기본값입니다.
    • WRITE_TRUNCATE: 인스턴스를 쓰기 전에 테이블의 모든 기존 데이터를 삭제합니다.
    • WRITE_APPEND: 기존 테이블에 데이터를 추가합니다.

다음 샘플은 curl을 사용하는 POST 요청을 보여줍니다.

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"
}

응답에 작업 이름이 포함됩니다. 작업 상태를 추적하려면 작업 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 저장소에서 다른 프로젝트의 BigQuery 테이블로 DICOM 메타데이터를 내보내려면 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"
}

응답에 작업 이름이 포함됩니다. 작업 상태를 추적하려면 작업 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를 지정하여 전체 시리즈를 내보낼 수 있습니다.

다음 필터 파일을 예로 들어 봅시다. 이 필터 파일은 1개의 연구, 2개의 시리즈, 3개의 개별 인스턴스를 내보냅니다.

/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 내보내기 테이블의 이름입니다. 이름에는 문자(대문자 또는 소문자), 숫자, 밑줄만 사용할 수 있습니다. 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: 기존 테이블에 데이터를 추가합니다.

다음 샘플은 curl을 사용하는 POST 요청을 보여줍니다.

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"
}

응답에 작업 이름이 포함됩니다. 작업 상태를 추적하려면 작업 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"
}

응답에 작업 이름이 포함됩니다. 작업 상태를 추적하려면 작업 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(Picture Archiving and Communication System) 또는 VNA(Vendor Neutral Archive)와 같이 다른 시스템에서 검색하기 어려운 대규모 메타데이터를 검색하려는 경우를 생각해 봅시다. 다음 쿼리는 환자의 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"
  }
]

최신 연구 쿼리

데이터 세트의 PTS 읽기 작업 목록에 데이터 세트의 최신 연구를 채우고 싶다고 가정해 보겠습니다.

다음 쿼리는 인스턴스 수 및 주변 메타데이터와 함게 최신 연구를 검색하고 표시하는 방법을 보여줍니다. 이 샘플은 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 내보내기 요청 문제 해결

DICOM에서 BigQuery 요청으로 메타데이터 내보내기 중에 오류가 발생하면 오류가 Cloud Logging에 로깅됩니다. 자세한 내용은 Cloud Logging에서 오류 로그 보기를 참조하세요.