Transmitir cambios en los recursos FHIR a BigQuery

En esta página se explica cómo configurar un almacén FHIR para que exporte automáticamente recursos FHIR a tablas de BigQuery cada vez que se cree, actualice, elimine o se le apliquen parches a un recurso FHIR. Este proceso se denomina transmisión de BigQuery.

Puedes usar la transmisión de BigQuery para hacer lo siguiente:

  • Sincroniza los datos de un almacén de recursos de FHIR con un conjunto de datos de BigQuery casi en tiempo real.
  • Realiza consultas complejas en datos FHIR sin tener que exportarlos a BigQuery cada vez que quieras analizarlos.

Para mejorar el rendimiento de las consultas y reducir los costes, puede configurar BigQuery para que transmita datos a tablas particionadas. Para obtener instrucciones, consulta Enviar recursos FHIR a tablas con particiones.

Antes de empezar

Consulta el artículo Exportar recursos FHIR a BigQuery para saber cómo funciona el proceso de exportación.

Limitaciones

Si importas recursos FHIR desde Cloud Storage, los cambios no se transmiten a BigQuery.

Configurar permisos de BigQuery

Para habilitar la transmisión de BigQuery, debes conceder permisos adicionales a la cuenta de servicio del agente de servicio de Cloud Healthcare. Para obtener más información, consulta Permisos de BigQuery para almacenes FHIR.

Configurar la transmisión de BigQuery en un almacén de FHIR

Para habilitar la transmisión de BigQuery, configura el objeto StreamConfigs en tu almacén FHIR. En StreamConfigs, puede configurar la matriz resourceTypes[] para controlar a qué tipos de recursos FHIR se aplica la transmisión de BigQuery. Si no especifica resourceTypes[], la transmisión de BigQuery se aplica a todos los tipos de recursos FHIR.

Para obtener explicaciones sobre otras configuraciones disponibles en StreamConfigs, como BigQueryDestination, consulta Exportar recursos FHIR.

En los ejemplos siguientes se muestra cómo habilitar la transmisión de BigQuery en un almacén FHIR que ya existe.

Consola

Para configurar la transmisión de BigQuery en un almacén de FHIR que ya tengas con la consolaGoogle Cloud , sigue estos pasos:

  1. En la Google Cloud consola, ve a la página Conjuntos de datos.

    Ve a Conjuntos de datos.

  2. Seleccione el conjunto de datos que contenga el almacén FHIR que quiera editar.

  3. En la lista Almacenes de datos, haga clic en el almacén de recursos de FHIR que quiera editar.

  4. En la sección Streaming de BigQuery, sigue estos pasos:

    1. Haz clic en Añadir nueva configuración de streaming.
    2. En la sección Nueva configuración de streaming, haga clic en Examinar para seleccionar el conjunto de datos de BigQuery al que quiera transmitir los recursos FHIR modificados.
    3. En el menú desplegable Tipo de esquema, seleccione el esquema de salida de la tabla de BigQuery. Están disponibles los siguientes esquemas:
      • Analytics Un esquema basado en el documento SQL on FHIR. Como BigQuery solo permite 10.000 columnas por tabla, no se generan esquemas para los campos Parameters.parameter.resource, Bundle.entry.resource y Bundle.entry.response.outcome.
      • Analytics V2. Un esquema similar al de Analytics, con compatibilidad adicional para lo siguiente: El esquema de Analytics V2 usa más espacio en la tabla de destino que el esquema de Analytics.
    4. Selecciona un nivel de profundidad en el control deslizante Profundidad de la estructura recursiva para definir la profundidad de todas las estructuras recursivas del esquema de salida. De forma predeterminada, el valor recursivo es 2.
    5. En la lista Seleccionar tipos de recursos FHIR, elige los tipos de recursos que quieras transmitir.
  5. Haz clic en Hecho para guardar la configuración de la emisión.

gcloud

La CLI de gcloud no admite esta acción. En su lugar, usa la Google Cloud consolacurl, PowerShell o el lenguaje que prefieras.

REST

Para configurar la transmisión de BigQuery en un almacén FHIR, usa el método projects.locations.datasets.fhirStores.patch.

En los siguientes ejemplos no se especifica el array resourceTypes[], por lo que la transmisión de BigQuery está habilitada para todos los tipos de recursos FHIR.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • PROJECT_ID: el ID de tu Google Cloud proyecto
  • LOCATION: la ubicación del conjunto de datos
  • DATASET_ID: el conjunto de datos superior del almacén FHIR
  • FHIR_STORE_ID: el ID del almacén FHIR
  • BIGQUERY_DATASET_ID: el nombre de un conjunto de datos de BigQuery donde se transmiten los cambios en los recursos FHIR
  • SCHEMA_TYPE: valor de la enumeración SchemaType. Usa uno de los siguientes valores:
    • ANALYTICS. Un esquema basado en el documento SQL on FHIR. Como BigQuery solo permite 10.000 columnas por tabla, no se generan esquemas para los campos Parameters.parameter.resource, Bundle.entry.resource y Bundle.entry.response.outcome.
    • ANALYTICS_V2. Un esquema similar a ANALYTICS con compatibilidad adicional para lo siguiente:

      ANALYTICS_V2 usa más espacio en la tabla de destino que ANALYTICS

      .
  • WRITE_DISPOSITION: valor de la enumeración WriteDisposition. Usa uno de los siguientes valores:
    • WRITE_EMPTY. Solo exporta datos si las tablas de BigQuery de destino están vacías.
    • WRITE_TRUNCATE. Borra todos los datos de las tablas de BigQuery antes de escribir los recursos FHIR.
    • WRITE_APPEND. Añade datos a las tablas de BigQuery de destino.

Cuerpo JSON de la solicitud:

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

Para enviar tu solicitud, elige una de estas opciones:

curl

Guarda el cuerpo de la solicitud en un archivo llamado request.json. Ejecuta el siguiente comando en el terminal para crear o sobrescribir este archivo en el directorio actual:

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

A continuación, ejecuta el siguiente comando para enviar tu solicitud REST:

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

Guarda el cuerpo de la solicitud en un archivo llamado request.json. Ejecuta el siguiente comando en el terminal para crear o sobrescribir este archivo en el directorio actual:

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

A continuación, ejecuta el siguiente comando para enviar tu solicitud REST:

$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

Explorador de APIs

Copia el cuerpo de la solicitud y abre la página de referencia del método. El panel Explorador de APIs se abre en la parte derecha de la página. Puedes interactuar con esta herramienta para enviar solicitudes. Pega el cuerpo de la solicitud en esta herramienta, rellena los campos obligatorios y haz clic en Ejecutar.

Deberías recibir una respuesta JSON similar a la siguiente.

Si has configurado algún campo del recurso FhirStore, también aparecerá en la respuesta.

De forma predeterminada, cuando transmites cambios en los recursos FHIR a BigQuery, se crea una vista para cada recurso transmitido. La vista tiene las siguientes propiedades:

  • Tiene el mismo nombre que el recurso y la tabla del recurso en el conjunto de datos de BigQuery. Por ejemplo, cuando transmite un recurso Patient, se crea una tabla llamada Patient con una vista llamada Patientview.
  • Solo contiene la versión actual del recurso, no todas las versiones anteriores.

Transmitir recursos FHIR a tablas con particiones

Para exportar recursos FHIR a tablas particionadas de BigQuery, define la enumeración TimePartitioning en el campo lastUpdatedPartitionConfig de tu almacén FHIR.

Las tablas con particiones funcionan como las tablas con particiones por unidad de tiempo de BigQuery. Las tablas particionadas tienen una columna adicional llamada lastUpdated, que es un duplicado de la columna meta.lastUpdated, que se genera a partir del campo meta.lastUpdated de un recurso FHIR. BigQuery usa la lastUpdatedcolumna para crear particiones de tablas por hora, día, mes o año.

Consulta Seleccionar una partición diaria, por hora, mensual o anual para ver recomendaciones sobre cómo elegir la granularidad de una partición.

No puedes convertir tablas de BigQuery que ya tengas y que no estén particionadas en tablas particionadas. Si exportas los cambios del recurso Patient a una tabla Patients sin particiones y, más adelante, creas un almacén FHIR con particiones de tabla que exporta datos al mismo conjunto de datos de BigQuery, la API Cloud Healthcare seguirá exportando datos a la tabla Patients sin particiones. Para empezar a usar una tabla con particiones, elimina la tabla Patients o usa otro conjunto de datos de BigQuery.

Si añade particiones a una configuración de almacén FHIR, podrá seguir exportando datos a tablas sin particiones. Sin embargo, la creación de particiones solo se aplicará a las tablas nuevas.

En los ejemplos siguientes se muestra cómo habilitar la transmisión de BigQuery a tablas particionadas en un almacén FHIR.

Consola

La consola de Google Cloud y la CLI de gcloud no admiten esta acción. En su lugar, usa curl, PowerShell o el lenguaje que prefieras.

gcloud

La consola de Google Cloud y la CLI de gcloud no admiten esta acción. En su lugar, usa curl, PowerShell o el lenguaje que prefieras.

REST

Para configurar la transmisión de BigQuery a tablas con particiones en un almacén FHIR, usa el método projects.locations.datasets.fhirStores.patch.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • PROJECT_ID: el ID de tu Google Cloud proyecto
  • LOCATION: la ubicación del conjunto de datos
  • DATASET_ID: el conjunto de datos superior del almacén FHIR
  • FHIR_STORE_ID: el ID del almacén FHIR
  • BIGQUERY_DATASET_ID: el nombre de un conjunto de datos de BigQuery donde se transmiten los cambios en los recursos FHIR
  • SCHEMA_TYPE: valor de la enumeración SchemaType. Usa uno de los siguientes valores:
    • ANALYTICS. Un esquema basado en el documento SQL on FHIR. Como BigQuery solo permite 10.000 columnas por tabla, no se generan esquemas para los campos Parameters.parameter.resource, Bundle.entry.resource y Bundle.entry.response.outcome.
    • ANALYTICS_V2. Un esquema similar a ANALYTICS con compatibilidad adicional para lo siguiente:

      ANALYTICS_V2 usa más espacio en la tabla de destino que ANALYTICS

      .
  • TIME_PARTITION_TYPE: la granularidad con la que se particionan los recursos FHIR exportados. Usa uno de los siguientes valores:
    • HOUR: particiona los datos por horas
    • DAY: particiona los datos por día
    • MONTH: particiona los datos por mes
    • YEAR: particiona los datos por año
  • WRITE_DISPOSITION: valor de la enumeración WriteDisposition. Usa uno de los siguientes valores:
    • WRITE_EMPTY. Solo exporta datos si las tablas de BigQuery de destino están vacías.
    • WRITE_TRUNCATE. Borra todos los datos de las tablas de BigQuery antes de escribir los recursos FHIR.
    • WRITE_APPEND. Añade datos a las tablas de BigQuery de destino.

Cuerpo JSON de la solicitud:

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

Para enviar tu solicitud, elige una de estas opciones:

curl

Guarda el cuerpo de la solicitud en un archivo llamado request.json. Ejecuta el siguiente comando en el terminal para crear o sobrescribir este archivo en el directorio actual:

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

A continuación, ejecuta el siguiente comando para enviar tu solicitud REST:

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

Guarda el cuerpo de la solicitud en un archivo llamado request.json. Ejecuta el siguiente comando en el terminal para crear o sobrescribir este archivo en el directorio actual:

@'
{
  "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

A continuación, ejecuta el siguiente comando para enviar tu solicitud REST:

$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

Explorador de APIs

Copia el cuerpo de la solicitud y abre la página de referencia del método. El panel Explorador de APIs se abre en la parte derecha de la página. Puedes interactuar con esta herramienta para enviar solicitudes. Pega el cuerpo de la solicitud en esta herramienta, rellena los campos obligatorios y haz clic en Ejecutar.

Deberías recibir una respuesta JSON similar a la siguiente:

Consultar una tabla con particiones

Para reducir los costes de las consultas en tablas con particiones, usa la cláusula WHERE para filtrar por unidades de tiempo.

Por ejemplo, supongamos que asignas el valor DAY al enum PartitionType. Para consultar una tabla Patients para obtener recursos Patient que cambiaron en una fecha específica, ejecuta la siguiente consulta:

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

Migrar de Analytics a Analytics V2

No puedes migrar un conjunto de datos de BigQuery del esquema Analytics al esquema Analytics V2 con ningún método, incluidos los siguientes:

Esto se debe a que las columnas de la tabla de BigQuery de las extensiones FHIR del esquema Analytics tienen el modo NULLABLE, mientras que las del esquema Analytics V2 tienen el modo REPEATED. BigQuery no permite cambiar el modo de una columna de NULLABLE a REPEATED. Por lo tanto, los dos tipos de esquema no son compatibles.

Para migrar el tipo de esquema de los recursos FHIR exportados de Analytics a Analytics V2, debes exportar los recursos FHIR a un nuevo conjunto de datos de BigQuery mediante una nueva configuración de streaming con el tipo de esquema actualizado. Para ello, sigue estos pasos:

  1. Crea un conjunto de datos de BigQuery.

  2. Define los permisos del conjunto de datos de BigQuery.

  3. Añade una nueva configuración de streaming al almacén FHIR con el tipo de esquema definido como Analytics V2.

  4. Rellena los datos que ya tengas exportando los datos de FHIR con los siguientes ajustes. Consulta el artículo sobre exportar recursos FHIR para obtener instrucciones sobre cómo configurar estos ajustes con la consola de Google Cloud , la CLI de Google Cloud o la API REST. Los siguientes ajustes se aplican a la API REST:

Es posible que las vistas de BigQuery que corresponden a algunos o a todos los recursos FHIR del conjunto de datos original de BigQuery no estén en el nuevo conjunto de datos. Para solucionar este problema, consulta No se puede crear la vista de recursos FHIR.

Solucionar problemas de streaming de FHIR

Si se producen errores al enviar cambios en los recursos a BigQuery, se registran en Cloud Logging. Para obtener más información, consulta Ver registros de errores en Cloud Logging.

No se puede convertir una columna de NULLABLE a REPEATED

Este error se debe a que la extensión se ha repetido. Para resolver este error, usa el tipo de esquema ANALYTICS_V2. Si ya usas ANALYTICS_V2, puede que haya un conflicto entre dos extensiones o entre una extensión y otro campo.

Los nombres de las columnas se generan a partir del texto que aparece después del último carácter / en las URLs de extensión. Si una URL de extensión termina con un valor como /resource_field name, puede producirse un conflicto.

Para evitar que se vuelva a producir este error, no uses extensiones si sus nombres de campo son los mismos que los de los campos de recursos que estás rellenando.

Falta la creación de la vista de recursos FHIR

Si exporta en bloque un recurso FHIR a BigQuery antes de transmitirlo, BigQuery no creará vistas para ese recurso.

Por ejemplo, es posible que no vea ninguna visualización de los recursos de Encounter en la siguiente situación:

  1. Configura la transmisión de BigQuery en un almacén FHIR y, a continuación, usa la API REST para crear un recurso Patient.

    BigQuery crea una tabla y una vista para el recurso Patient.

  2. Exporta en bloque los recursos Encounter al mismo conjunto de datos de BigQuery que en el paso anterior.

    BigQuery crea una tabla para los recursos Encounter.

  3. Usa la API REST para crear un recurso Encounter.

    Después de este paso, no se crearán vistas de BigQuery para el recurso Encounter.

Para solucionar este problema, usa la siguiente consulta para crear una vista:

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');

Haz los cambios siguientes:

  • PROJECT_ID: el ID de tu Google Cloud proyecto
  • BIGQUERY_DATASET_ID: el ID del conjunto de datos de BigQuery al que has exportado de forma masiva el recurso FHIR
  • RESOURCE_TABLE: el nombre de la tabla correspondiente al recurso FHIR para el que quieras crear vistas

Después de crear la vista, puede seguir transmitiendo cambios al recurso FHIR y la vista se actualizará en consecuencia.

Siguientes pasos

Para ver un tutorial sobre un caso práctico de transmisión de cambios en los recursos FHIR, consulta el artículo Transmitir y sincronizar recursos FHIR con BigQuery.