Melakukan streaming perubahan resource FHIR ke BigQuery

Halaman ini menjelaskan cara mengonfigurasi penyimpanan FHIR untuk otomatis mengekspor resource FHIR ke tabel BigQuery setiap kali resource FHIR dibuat, diperbarui, di-patch, atau dihapus. Proses ini disebut streaming BigQuery.

Anda dapat menggunakan streaming BigQuery untuk melakukan hal berikut:

  • Sinkronkan data di penyimpanan FHIR dengan set data BigQuery secara hampir real time.
  • Lakukan kueri kompleks pada data FHIR tanpa perlu mengekspornya ke BigQuery setiap kali Anda ingin menganalisis data.

Untuk meningkatkan performa kueri dan mengurangi biaya, Anda dapat mengonfigurasi streaming BigQuery ke tabel berpartisi. Untuk mengetahui petunjuknya, lihat Menstreaming resource FHIR ke tabel berpartisi.

Sebelum memulai

Baca artikel Mengekspor resource FHIR ke BigQuery untuk memahami cara kerja proses ekspor.

Batasan

Jika Anda mengimpor resource FHIR dari Cloud Storage, perubahan tidak akan di-streaming ke BigQuery.

Menetapkan izin BigQuery

Untuk mengaktifkan streaming BigQuery, Anda harus memberikan izin tambahan ke akun layanan Agen Layanan Cloud Healthcare. Untuk mengetahui informasi selengkapnya, lihat Izin BigQuery penyimpanan FHIR.

Mengonfigurasi streaming BigQuery di penyimpanan FHIR

Untuk mengaktifkan streaming BigQuery, konfigurasikan objek StreamConfigs di penyimpanan FHIR Anda. Di StreamConfigs, Anda dapat mengonfigurasi array resourceTypes[] untuk mengontrol jenis resource FHIR yang berlaku untuk streaming BigQuery. Jika Anda tidak menentukan resourceTypes[], streaming BigQuery akan berlaku untuk semua jenis resource FHIR.

Untuk penjelasan konfigurasi lain yang tersedia di StreamConfigs, seperti BigQueryDestination, lihat Mengekspor resource FHIR.

Contoh berikut menunjukkan cara mengaktifkan streaming BigQuery di penyimpanan FHIR yang ada.

Konsol

Untuk mengonfigurasi streaming BigQuery di penyimpanan FHIR yang ada menggunakan konsol Google Cloud, selesaikan langkah-langkah berikut:

  1. Di konsol Google Cloud, buka halaman Datasets.

    Buka Set Data

  2. Pilih set data yang berisi penyimpanan FHIR yang ingin Anda edit.

  3. Dalam daftar Penyimpanan data, klik penyimpanan FHIR yang ingin Anda edit.

  4. Di bagian BigQuery streaming, selesaikan langkah-langkah berikut:

    1. Klik Tambahkan konfigurasi streaming baru.
    2. Di bagian New streaming configuration, klik Browse untuk memilih set data BigQuery tempat Anda ingin memutar streaming resource FHIR yang diubah.
    3. Di dropdown Schema type, pilih skema output untuk tabel BigQuery. Skema berikut tersedia:
      • Analytics. Skema berdasarkan dokumen SQL on FHIR. Karena BigQuery hanya mengizinkan 10.000 kolom per tabel, skema tidak dibuat untuk kolom Parameters.parameter.resource, Bundle.entry.resource, dan Bundle.entry.response.outcome.
      • Analytics V2. Skema yang mirip dengan skema Analytics, dengan dukungan tambahan untuk hal berikut: Skema Analytics V2 menggunakan lebih banyak ruang di tabel tujuan daripada skema Analytics.
    4. Pilih tingkat kedalaman di penggeser Kedalaman Struktur Rekursif untuk menetapkan kedalaman untuk semua struktur rekursif dalam skema output. Secara default, nilai rekursifnya adalah 2.
    5. Dalam daftar Select FHIR resource types, pilih jenis resource yang akan di-streaming.
  5. Klik Done untuk menyimpan konfigurasi streaming.

gcloud

gcloud CLI tidak mendukung tindakan ini. Sebagai gantinya, gunakan konsol Google Cloud, curl, PowerShell, atau bahasa pilihan Anda.

REST

Untuk mengonfigurasi streaming BigQuery di penyimpanan FHIR yang ada, gunakan metode projects.locations.datasets.fhirStores.patch.

Contoh berikut tidak menentukan array resourceTypes[], sehingga streaming BigQuery diaktifkan untuk semua jenis resource FHIR.

Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

  • PROJECT_ID: ID project Google Cloud Anda
  • LOCATION: lokasi set data
  • DATASET_ID: set data induk penyimpanan FHIR
  • FHIR_STORE_ID: ID FHIR store
  • BIGQUERY_DATASET_ID: nama set data BigQuery yang ada tempat Anda melakukan streaming perubahan resource FHIR
  • SCHEMA_TYPE: nilai untuk enum SchemaType. Gunakan salah satu nilai berikut:
    • ANALYTICS. Skema berdasarkan dokumen SQL on FHIR. Karena BigQuery hanya mengizinkan 10.000 kolom per tabel, skema tidak dibuat untuk kolom Parameters.parameter.resource, Bundle.entry.resource, dan Bundle.entry.response.outcome.
    • ANALYTICS_V2. Skema yang mirip dengan ANALYTICS dengan dukungan tambahan untuk hal berikut:

      ANALYTICS_V2 menggunakan lebih banyak ruang di tabel tujuan daripada ANALYTICS

      .
  • WRITE_DISPOSITION: nilai untuk enum WriteDisposition. Gunakan salah satu nilai berikut:
    • WRITE_EMPTY. Hanya ekspor data jika tabel BigQuery tujuan kosong.
    • WRITE_TRUNCATE. Menghapus semua data yang ada di tabel BigQuery sebelum menulis resource FHIR.
    • WRITE_APPEND. Menambahkan data ke tabel BigQuery tujuan.

Meminta isi JSON:

{
  "streamConfigs": [
    {
      "bigqueryDestination": {
        "datasetUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID",
        "schemaConfig": {
          "schemaType": "SCHEMA_TYPE",
        },
        "writeDisposition": "WRITE_DISPOSITION"
      }
    }
  ]
}

Untuk mengirim permintaan Anda, pilih salah satu opsi berikut:

curl

Simpan isi permintaan dalam file bernama request.json. Jalankan perintah berikut di terminal untuk membuat atau menimpa file ini di direktori saat ini:

cat > request.json << 'EOF'
{
  "streamConfigs": [
    {
      "bigqueryDestination": {
        "datasetUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID",
        "schemaConfig": {
          "schemaType": "SCHEMA_TYPE",
        },
        "writeDisposition": "WRITE_DISPOSITION"
      }
    }
  ]
}
EOF

Kemudian, jalankan perintah berikut untuk mengirim permintaan REST Anda:

curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?updateMask=streamConfigs"

PowerShell

Simpan isi permintaan dalam file bernama request.json. Jalankan perintah berikut di terminal untuk membuat atau menimpa file ini di direktori saat ini:

@'
{
  "streamConfigs": [
    {
      "bigqueryDestination": {
        "datasetUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID",
        "schemaConfig": {
          "schemaType": "SCHEMA_TYPE",
        },
        "writeDisposition": "WRITE_DISPOSITION"
      }
    }
  ]
}
'@  | Out-File -FilePath request.json -Encoding utf8

Kemudian jalankan perintah berikut untuk mengirim permintaan REST Anda:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method PATCH `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?updateMask=streamConfigs" | Select-Object -Expand Content

APIs Explorer

Salin isi permintaan dan buka halaman referensi metode. Panel API Explorer terbuka di sisi kanan halaman. Anda bisa berinteraksi dengan alat ini untuk mengirim permintaan. Tempelkan isi permintaan di alat ini, lengkapi kolom lainnya yang wajib diisi, lalu klik Jalankan.

Anda akan menerima respons JSON yang mirip dengan berikut ini.

Jika Anda mengonfigurasi kolom apa pun di resource FhirStore, kolom tersebut juga akan muncul dalam respons.

Secara default, saat Anda melakukan streaming perubahan resource FHIR ke BigQuery, tampilan akan dibuat untuk setiap resource yang di-streaming. Tampilan memiliki properti berikut:

  • Namanya sama dengan resource dan tabel resource di set data BigQuery. Misalnya, saat Anda melakukan streaming resource Pasien, tabel bernama Patient akan dibuat dengan tampilan bernama Patientview.
  • File ini hanya berisi versi resource saat ini, bukan semua versi historis.

Men-streaming resource FHIR ke tabel berpartisi

Untuk mengekspor resource FHIR ke tabel berpartisi BigQuery, tetapkan enum TimePartitioning di kolom lastUpdatedPartitionConfig di penyimpanan FHIR Anda.

Tabel yang dipartisi berfungsi seperti tabel berpartisi unit waktu BigQuery. Tabel berpartisi memiliki kolom tambahan bernama lastUpdated, yang merupakan duplikat kolom meta.lastUpdated yang dihasilkan dari kolom meta.lastUpdated di resource FHIR. BigQuery menggunakan kolom lastUpdated untuk mempartisi tabel berdasarkan jam, hari, bulan, atau tahun.

Lihat Memilih partisi harian, per jam, bulanan, atau tahunan untuk mengetahui rekomendasi tentang cara memilih perincian partisi.

Anda tidak dapat mengonversi tabel BigQuery yang ada dan tidak dipartisi menjadi tabel berpartisi. Jika Anda mengekspor perubahan Resource pasien ke tabel Patients yang tidak dipartisi, lalu membuat penyimpanan FHIR baru dengan partisi tabel yang diekspor ke set data BigQuery yang sama, Cloud Healthcare API masih mengekspor data ke tabel Patients yang tidak dipartisi. Untuk mulai menggunakan tabel berpartisi, hapus tabel Patients yang ada atau gunakan set data BigQuery yang berbeda.

Jika menambahkan partisi ke konfigurasi penyimpanan FHIR yang ada, Anda masih dapat mengekspor ke tabel yang tidak berpartisi yang ada. Namun, partisi hanya akan berlaku pada tabel baru.

Contoh berikut menunjukkan cara mengaktifkan streaming BigQuery ke tabel yang dipartisi di penyimpanan FHIR yang ada.

Konsol

Konsol Google Cloud dan gcloud CLI tidak mendukung tindakan ini. Sebagai gantinya, gunakan curl, PowerShell, atau bahasa pilihan Anda.

gcloud

Konsol Google Cloud dan gcloud CLI tidak mendukung tindakan ini. Sebagai gantinya, gunakan curl, PowerShell, atau bahasa pilihan Anda.

REST

Untuk mengonfigurasi streaming BigQuery ke tabel yang dipartisi di penyimpanan FHIR yang ada, gunakan metode projects.locations.datasets.fhirStores.patch.

Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

  • PROJECT_ID: ID project Google Cloud Anda
  • LOCATION: lokasi set data
  • DATASET_ID: set data induk penyimpanan FHIR
  • FHIR_STORE_ID: ID FHIR store
  • BIGQUERY_DATASET_ID: nama set data BigQuery yang ada tempat Anda melakukan streaming perubahan resource FHIR
  • SCHEMA_TYPE: nilai untuk enum SchemaType. Gunakan salah satu nilai berikut:
    • ANALYTICS. Skema berdasarkan dokumen SQL on FHIR. Karena BigQuery hanya mengizinkan 10.000 kolom per tabel, skema tidak dibuat untuk kolom Parameters.parameter.resource, Bundle.entry.resource, dan Bundle.entry.response.outcome.
    • ANALYTICS_V2. Skema yang mirip dengan ANALYTICS dengan dukungan tambahan untuk hal berikut:

      ANALYTICS_V2 menggunakan lebih banyak ruang di tabel tujuan daripada ANALYTICS

      .
  • TIME_PARTITION_TYPE: tingkat perincian untuk mempartisi resource FHIR yang diekspor. Gunakan salah satu nilai berikut:
    • HOUR: mempartisi data menurut jam
    • DAY: mempartisi data menurut hari
    • MONTH: mempartisi data menurut bulan
    • YEAR: mempartisi data menurut tahun
  • WRITE_DISPOSITION: nilai untuk enum WriteDisposition. Gunakan salah satu nilai berikut:
    • WRITE_EMPTY. Hanya ekspor data jika tabel BigQuery tujuan kosong.
    • WRITE_TRUNCATE. Menghapus semua data yang ada di tabel BigQuery sebelum menulis resource FHIR.
    • WRITE_APPEND. Menambahkan data ke tabel BigQuery tujuan.

Meminta isi JSON:

{
  "streamConfigs": [
    {
      "bigqueryDestination": {
        "datasetUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID",
        "schemaConfig": {
          "schemaType": "SCHEMA_TYPE",
          "lastUpdatedPartitionConfig": {
            "type": "TIME_PARTITION_TYPE"
          }
        },
        "writeDisposition": "WRITE_DISPOSITION"
      }
    }
  ]
}

Untuk mengirim permintaan Anda, pilih salah satu opsi berikut:

curl

Simpan isi permintaan dalam file bernama request.json. Jalankan perintah berikut di terminal untuk membuat atau menimpa file ini di direktori saat ini:

cat > request.json << 'EOF'
{
  "streamConfigs": [
    {
      "bigqueryDestination": {
        "datasetUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID",
        "schemaConfig": {
          "schemaType": "SCHEMA_TYPE",
          "lastUpdatedPartitionConfig": {
            "type": "TIME_PARTITION_TYPE"
          }
        },
        "writeDisposition": "WRITE_DISPOSITION"
      }
    }
  ]
}
EOF

Kemudian, jalankan perintah berikut untuk mengirim permintaan REST Anda:

curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?updateMask=streamConfigs"

PowerShell

Simpan isi permintaan dalam file bernama request.json. Jalankan perintah berikut di terminal untuk membuat atau menimpa file ini di direktori saat ini:

@'
{
  "streamConfigs": [
    {
      "bigqueryDestination": {
        "datasetUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID",
        "schemaConfig": {
          "schemaType": "SCHEMA_TYPE",
          "lastUpdatedPartitionConfig": {
            "type": "TIME_PARTITION_TYPE"
          }
        },
        "writeDisposition": "WRITE_DISPOSITION"
      }
    }
  ]
}
'@  | Out-File -FilePath request.json -Encoding utf8

Kemudian jalankan perintah berikut untuk mengirim permintaan REST Anda:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method PATCH `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?updateMask=streamConfigs" | Select-Object -Expand Content

APIs Explorer

Salin isi permintaan dan buka halaman referensi metode. Panel API Explorer terbuka di sisi kanan halaman. Anda bisa berinteraksi dengan alat ini untuk mengirim permintaan. Tempelkan isi permintaan di alat ini, lengkapi kolom lainnya yang wajib diisi, lalu klik Jalankan.

Anda akan melihat respons JSON seperti berikut:

Membuat kueri tabel berpartisi

Untuk mengurangi biaya kueri saat membuat kueri tabel yang dipartisi, gunakan klausa WHERE untuk memfilter menurut unit waktu.

Misalnya, Anda menetapkan enum PartitionType ke DAY. Untuk membuat kueri tabel Patients untuk resource Pasien yang berubah pada tanggal tertentu, jalankan kueri berikut:

SELECT * FROM `PROJECT_ID.BIGQUERY_DATASET.Patients`
  WHERE DATE(lastUpdated) = 'YYYY-MM-DD'

Bermigrasi dari Analytics ke Analytics V2

Anda tidak dapat memigrasikan set data BigQuery yang ada dari skema Analytics ke skema Analytics V2 menggunakan metode apa pun, termasuk yang berikut:

  • Mengubah jenis skema tabel di BigQuery.
  • Mengubah jenis skema dalam konfigurasi streaming FHIR yang ada.

Hal ini karena kolom tabel BigQuery untuk ekstensi FHIR dalam skema Analytics memiliki mode yang ditetapkan ke NULLABLE, sedangkan kolom dalam skema Analytics V2 ditetapkan ke REPEATED. BigQuery tidak mengizinkan perubahan mode kolom dari NULLABLE menjadi REPEATED. Oleh karena itu, kedua jenis skema tersebut tidak kompatibel.

Untuk memigrasikan jenis skema resource FHIR yang diekspor dari Analytics ke Analytics V2, Anda harus mengekspor resource FHIR ke set data BigQuery baru menggunakan konfigurasi streaming baru dengan jenis skema yang diperbarui. Caranya, lakukan langkah-langkah berikut:

  1. Buat set data BigQuery baru.

  2. Tetapkan izin untuk set data BigQuery.

  3. Tambahkan konfigurasi streaming baru ke penyimpanan FHIR dengan jenis skema yang ditetapkan ke Analytics V2.

  4. Isi ulang data yang ada dengan mengekspor data FHIR yang ada menggunakan setelan berikut. Lihat mengekspor resource FHIR untuk mengetahui petunjuk cara mengonfigurasi setelan ini menggunakan konsol Google Cloud, Google Cloud CLI, atau REST API. Setelan berikut berlaku untuk REST API:

Tampilan di BigQuery yang sesuai dengan beberapa atau semua resource FHIR di set data BigQuery asli mungkin tidak ada di set data baru Anda. Untuk memecahkan masalah ini, lihat Pembuatan tampilan resource FHIR tidak ada.

Memecahkan masalah streaming FHIR

Jika error terjadi saat perubahan resource dikirim ke BigQuery, error tersebut akan dicatat ke Cloud Logging. Untuk mengetahui informasi selengkapnya, lihat Melihat log error di Cloud Logging.

Tidak dapat mengonversi kolom dari NULLABLE menjadi REPEATED

Error ini disebabkan oleh ekstensi yang berulang. Untuk mengatasi error ini, gunakan jenis skema ANALYTICS_V2. Jika sudah menggunakan ANALYTICS_V2, Anda mungkin memiliki konflik antara dua ekstensi, atau konflik antara ekstensi dan kolom lain.

Nama kolom dihasilkan dari teks setelah karakter / terakhir di URL ekstensi. Jika URL ekstensi diakhiri dengan nilai seperti /resource_field name, konflik dapat terjadi.

Untuk mencegah error ini terjadi lagi, jangan gunakan ekstensi jika nama kolomnya sama dengan kolom resource yang Anda isi.

Pembuatan tampilan resource FHIR tidak ada

Jika Anda mengekspor secara massal resource FHIR ke BigQuery sebelum melakukan streaming resource FHIR tersebut, BigQuery tidak akan membuat tampilan untuk resource FHIR.

Misalnya, Anda mungkin tidak melihat tampilan apa pun untuk resource Encounter dalam situasi berikut:

  1. Anda mengonfigurasi streaming BigQuery di penyimpanan FHIR, lalu menggunakan REST API untuk membuat resource Pasien.

    BigQuery membuat tabel dan tampilan untuk resource Pasien.

  2. Anda mengekspor resource Encounter secara massal ke set data BigQuery yang sama dengan langkah sebelumnya.

    BigQuery membuat tabel untuk resource Encounter.

  3. Anda menggunakan REST API untuk membuat resource Pertemuan.

    Setelah langkah ini, tampilan BigQuery tidak dibuat untuk resource Encounter.

Untuk mengatasi masalah ini, gunakan kueri berikut untuk membuat tampilan:

SELECT
    * EXCEPT (_resource_row_id)
FROM (
  SELECT
    ROW_NUMBER() OVER(PARTITION BY id ORDER BY meta.lastUpdated DESC, commitTimestamp DESC) as _resource_row_id,
    *
    FROM `PROJECT_ID.BIGQUERY_DATASET_ID.RESOURCE_TABLE` AS p
) AS p
WHERE
  p._resource_row_id=1
  AND
  NOT EXISTS (
  SELECT
    *
  FROM
    UNNEST(p.meta.tag)
  WHERE
    code = 'DELETE');

Ganti kode berikut:

  • PROJECT_ID: ID project Google Cloud Anda
  • BIGQUERY_DATASET_ID: ID set data BigQuery tempat Anda mengekspor resource FHIR secara massal
  • RESOURCE_TABLE: nama tabel yang sesuai dengan resource FHIR yang ingin Anda buat tampilannya

Setelah membuat tampilan, Anda dapat terus melakukan streaming perubahan ke resource FHIR dan tampilan akan diperbarui.

Langkah selanjutnya

Untuk tutorial tentang kasus penggunaan untuk melakukan streaming perubahan resource FHIR, lihat Melakukan streaming dan menyinkronkan resource FHIR dengan BigQuery.