Siguiendo con la serie de entradas para desarrollar un prototipo de IoT para Salud, vamos a ver cómo conectar los datos recibidos en Pub/Sub con BigQuery para almacenamiento y análisis de datos históricos.
Los pasos van a ser los siguientes:
- Crear la tabla (con sus variables) en BigQuery.
- Definir el flujo de los datos en DataFlow.
1. Crear tabla en BigQuery
Lo primero que tenemos que hacer es crear la tabla en BigQuery, para que pueda recibir los datos. Así que abrimos BigQuery desde el menú hamburguesa, muy abajo en el apartado de BigData. Seleccionamos nuestro proyecto ("iot-gcp-281413") en el extremo inferior del listado de acciones, a la izquierda. Y hacemos click en "Crear Conjunto de Datos" sobre el proyecto en activo (en este caso "iot-gcp-281413").

Le llamaremos al conjunto de datos "sensores_covid19". Indicar la ubicación de los datos es opcional, pero nosotros indicamos que queremos que la ubicación de los datos esté en la "Unión Europea (EU)". Hacemos click abajo en el botón azul de confirmación que dice "Crear conjunto de datos".

Si volvemos al árbol-listado de la izquierda, veremos que subordinado al nombre de nuestro proyecto vemos el Conjunto de datos "sensores-covid19". Si hacemos click en "sensores-covid19", podemos visualizar lo siguiente:

Ahora haremos click en "Crear Tabla" para crear la tabla propiamente dicha. Según el tamaño de visualización de nuestra ventana de Google Cloud, nos aparecerá en texto o con un icono blanco sobre fondo azul. En el apartado de "Nombre de la tabla" pondremos "tabla_covid19". Ya tenemos el Conjunto de Datos ("sensores_covid19") sobre el proyecto ("IoT-GCP") y la tabla con su nombre ("tabla_covid19"). Ahora añadiremos los campos (las variables) correspondientes, haciendo click en "+Añadir campo".

Por cada campo o variable pondremos el nombre (p.e. "deviceID" para la primera), el tipo de variable ("String" para la primera) y el Modo ("Requerido" para la primera). Es interesante saber que solo puede haber una variable "Requerido". Y que si te equivocas al crear la tabla, es mejor eliminar la variable requerida y crear otra variable nueva (a mi me dio problemas editarla). Es importante que esta tabla tenga un esquema y formato exactamente igual que los datos entrantes. Que los nombres de las variables y el formato de cada variable coincida con los datos entrantes desde los sensores. De otro modo es muy probable que no se guarde o que se guarde mal. Terminaremos haciendo click en "Crear tabla".
(NOTA: en la imagen hay un error en Nombre de variable. Pone devideID y debería ser deviceID).

Un truco sería identificar el mensaje JSON de comunicación y copiar la información de ahí en la tabla de BigQuery. De este modo no nos equivocaremos. Pero eso no lo vamos a mostrar aquí. Es solo una idea.
Veremos que en el árbol de la izquierda ya tenemos el conjunto de datos "sensores_covid19" debajo del proyecto "iot-gcp-281413", y dentro del conjunto de datos la tabla "tabla_covid19".

Si abrimos la tabla, podremos ver en la pestaña "Esquema", las variables que forman la tabla, con su Nombre, Tipo (string, timestamp, integer, etc...) y Modo (required, nullable, etc...).

2. Flujo de datos en DataFlow
Ahora hay que indicar el flujo de los datos.
Podríamos hacerlo con varias herramientas, como Cloud Functions, Dataflow o Dataproc. En nuestro caso hemos seleccionado Dataflow.
Por eso abrimos Dataflow desde el Menu Hamburguesa (lo encontrarás dentro del apartado de "BigData") y en "Tareas" hacemos click en "Crear tarea a partir de plantilla".

El nombre de la tarea que hemos elegido es "iot-task", la conexión regional la misma que la del proyecto: "europe-west1", la plantilla de Dataflow: "Pub/Sub Topic to BigQuery" y no tocamos nada más de los parámetros obligatorias según se ve en la foto. Google nos dibujará a la derecha el flujo estándar de datos indicada por la plantilla seleccionada ("Pub/Sub Topic to BigQuery").
En Parámetros obligatorios tenemos que seleccionar un tópico de nuestro proyecto. En nuestro caso es "projects/iot-gcp-281413/topics/Humedad". La tabla de BigQuery a donde apuntará el flujo de datos, en nuestro caso "iot-gcp-281413:Test.io_prueba" que es la dirección de nuestro proyecto, nuestro conjunto de datos y la tabla. Por último, hay que indicar la ubicación de almacenamiento. Para ello haremos click en "Browse" y en la nueva ventana solicitaremos "crear una nueva Bucket" con la siguiente información:
- Asignar un nombre a tu segmento: "ejemplo1_iot_gcp". No olvides de añadir al final "/temp". Quedaría así: "gs://ejemplo1_iot_gcp/tmp".
- Elige dónde quieres almacenar los datos: "Región" y "europe-west1 (Bélgica)".
Y a todo lo demás, decimos que ok (aceptamos el default). Hacemos clicken "crear", y ya tenemos la bucket de almacenamiento. Hacemos doble click sobre él, y nos aparecerá como carpeta seleccionada.
Y hacemos click en "Ejecutar tarea" abajo a la izquierda.

Debería estar operativo ahora. Así que si volvemos a BigQuery y en "Recursos" seleccionamos el proyecto ("iot-gcp-281413"), el Conjunto de Datos ("sensores_covid19") y el nombre de la tabla ("tabla_covid19"), podremos ver el esquema de la tabla, con el ID de los sensores que están emitiendo ("datosEPS32") y las variables añadidas hasta el momento (spO2, pulseRate y respRate), en orden de timestamp. Si le damos a la pestaña que dice "Vista previa" podremos visualizar los datos que contiene la tabla, y comenzar a realizar queries según necesitemos (lo cubriremos en otro post sobre BigQuery y DataStudio que realizará Vera).



NOTA O AVISO FINAL: si dejas la tarea de DataFlow activada, te consumirá en torno a 10-15€ al día, aunque no recibas ningún dato. Es importante que tras finalizar la actividad, desactives la tarea. De hecho, la única manera de desactivarla es eliminar la tarea. Si luego quires activarla de nuevo, deberás crear una nueva tarea en Dataflow.
Para ello iremos a Dataflow, Tareas, abrir la tarea activa, y en el icono de los tres puntitos azules verticales, darle a "Detener".
