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:
En la Google Cloud consola, ve a la página Conjuntos de datos.
Seleccione el conjunto de datos que contenga el almacén FHIR que quiera editar.
En la lista Almacenes de datos, haga clic en el almacén de recursos de FHIR que quiera editar.
En la sección Streaming de BigQuery, sigue estos pasos:
- Haz clic en Añadir nueva configuración de streaming.
- 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.
- 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
yBundle.entry.response.outcome
. - Analytics V2. Un esquema similar al de Analytics, con compatibilidad adicional para lo siguiente:
- Extensiones con varios valores para el mismo
url
- Recursos FHIR contenidos
- Extensiones con varios valores para el mismo
- 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
- 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.
- En la lista Seleccionar tipos de recursos FHIR, elige los tipos de recursos que quieras transmitir.
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 camposParameters.parameter.resource
,Bundle.entry.resource
yBundle.entry.response.outcome
.ANALYTICS_V2
. Un esquema similar aANALYTICS
con compatibilidad adicional para lo siguiente:- Extensiones con varios valores para el mismo
url
- Recursos FHIR contenidos
.ANALYTICS_V2
usa más espacio en la tabla de destino queANALYTICS
- Extensiones con varios valores para el mismo
- 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 llamadaPatientview
. - 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 lastUpdated
columna 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 camposParameters.parameter.resource
,Bundle.entry.resource
yBundle.entry.response.outcome
.ANALYTICS_V2
. Un esquema similar aANALYTICS
con compatibilidad adicional para lo siguiente:- Extensiones con varios valores para el mismo
url
- Recursos FHIR contenidos
.ANALYTICS_V2
usa más espacio en la tabla de destino queANALYTICS
- Extensiones con varios valores para el mismo
- 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 horasDAY
: particiona los datos por díaMONTH
: particiona los datos por mesYEAR
: 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:
- Cambiar el tipo de esquema de la tabla en BigQuery.
- Cambiar el tipo de esquema en una configuración de streaming de FHIR.
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:
Añade una nueva configuración de streaming al almacén FHIR con el tipo de esquema definido como
Analytics V2
.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:
- Defina
WriteDisposition
enWRITE_APPEND
para añadir los datos a la tabla de destino. - Asigna el valor
ANALYTICS_V2
aSchemaType
.
- Defina
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:
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.
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.
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.