TabPy para trabajar con datos en ClickHouse de Tableau

Lo que hacemos en Dentsu Aegis Network todos los días es establecer comunicación entre las marcas y las personas, y el análisis de datos es una parte integral de este trabajo. En algunos casos, este proceso no requiere ciencia de datos (aunque tenemos uno), entonces usamos la plataforma Tableau BI. Su objetivo principal es brindar a nuestros empleados y clientes una interfaz conveniente para el consumo de datos sin escribir scripts, consultas SQL, etc.

En este artículo, describiremos cómo logramos resolver el problema de la interacción de Tableau con ClickHouse .

Declaración general del problema.


Nos enfrentamos a un desafío clásico. Tenemos gente Aman la fruta. A algunas personas les gusta una fruta, a otras les gustan todas las frutas, y el resto puede amar cualquier combinación de frutas.
imagen
Por lo tanto, es necesario permitir que el usuario en el tablero integrado en Tableau seleccione arbitrariamente varias frutas y vea cuántas personas aman al menos una fruta del conjunto. Por supuesto, no teníamos frutas, pero las personas eran reales, es solo que en "frutas" es más fácil entender el problema.

La cantidad de datos en nuestro caso es bastante grande. Había 13 mil "frutas" diferentes. La "fruta" más popular tenía casi 34 millones de fanáticos. En promedio, 450 mil personas aman cada "fruta". Total de amantes de la fruta: 282 millones.

Primera solución de frente


Dio la casualidad de que los datos para esta tarea los teníamos en PostgreSQL (PG) y en ClickHouse (CH). En PG había una tabla de referencia sobre "frutas", en CH - una tabla grande con una estructura: el identificador de la "fruta" y el identificador de la persona que ama esta "fruta". No hay un conector nativo para CH en Tableau, y todavía no quería transferir los datos a alguna parte, porque esto requeriría una reelaboración seria del sistema existente.

Intentamos conectar Tableau a CH utilizando el controlador ODBC y ver qué sucede.

  • No todos los controladores ODBC son igualmente útiles. Necesitamos una determinada versión en la que funcione la parte necesaria de la funcionalidad, pero no hay garantía de que el resto funcione si de repente la necesita.
  • No pudimos extraer todos los datos del extracto de Tableau, porque son 13,000 * 450,000 = 5,850,000,000 registros.

Luego decidimos usar el muestreo dentro de la consulta a la base de datos de CH, es decir, para hacer nuestra estimación del número de admiradores de la combinación seleccionada de "frutas" no en todas las personas, sino en una muestra del cinco por ciento para hacer el extracto más pequeño. Además, de inmediato realizamos una búsqueda de unión interna desde CH con un directorio PG "fruit" para obtener los nombres de "fruit". Ayudó: nuestro extracto se pudo generar en 5 horas.

Necesitábamos actualizar los datos en el tablero una vez al día, por lo que 5 horas de actualización del extracto parece estar bien, actualizaremos por la noche. Pero en el futuro necesitaríamos capacidades adicionales: debería haber más "frutos"; en consecuencia, el número y el tamaño de los grupos de personas cuya intersección que necesitábamos calcular también debería aumentar. Por lo tanto, una actualización larga del extracto no es en absoluto nuestra opción.

Además, hubo otro problema debido al muestreo. Sucedió que en diferentes partes del tablero los números, que supuestamente deberían coincidir, eran diferentes en nuestro país. Esto se debió al hecho de que en un lugar contamos con precisión el número de amantes de una fruta, y en parte con una combinación de frutas, inexacta. Ni a nosotros ni a nuestros usuarios nos gustó este resultado.

Luego decidimos no crear el extracto en absoluto. Para evitar cargar una gran cantidad de datos, dividimos los conjuntos de datos y utilizamos la conexión en vivo para CH. Entre los conjuntos de datos, se estableció una conexión utilizando la funcionalidad de relación de Tableau Edit incorporada. La fuente de datos PG se hizo primaria y se vinculó a CH como secundaria, utilizando el identificador de "fruta" que estaba en ambas tablas.

Por lo tanto, pudimos filtrar el origen de datos secundario utilizando el primario (combinación de datos). Pero no tuvimos éxito, porque después de lanzar el filtro de un origen de datos a otro, tuvimos que usar la función de contar personas en el subconjunto resultante (COUNTD), y la combinación de datos tiene una limitación que simplemente no permite que se haga. Dicha función directamente con dicha conexión de datos no funciona en principio.

Existe una solución alternativa que ayuda a sortear esta limitación de Tableau, pero se puede usar en conjuntos de datos relativamente pequeños, lo que claramente no es el caso en nuestro caso.

Después de eso, probamos otra opción. Los conjuntos de datos todavía estaban divididos y usaban conexión en vivo para CH. Aquí, se lanzó dentro de Tableau un filtro de un conjunto de datos con una descripción de "frutas" a un conjunto de datos con fanáticos de "frutas" mediante la acción de conjunto. Pero esta opción finalmente no encajaba debido a la inconveniente interfaz de usuario. En lugar del filtro familiar para el usuario, el usuario tendría que mirar la lista completa y seleccionar "frutas" a través de cntrl + clic, mientras que la función de aplicar estaba ausente cuando todos los valores seleccionados se aplican a la vez.

Como resultado, después de todos nuestros intentos, tuvimos que volver a la opción con extracto y muestreo, terriblemente lento y dando solo una respuesta aproximada.

imagen

Solución encontrada


Obviamente, no necesitamos extraer todos los datos en el extracto de Tableau. El usuario se siente incómodo al ver todos los datos a la vez: la cantidad de personas que aman todas las "frutas". Necesita un conjunto de un promedio de 10 "frutas". Es una pena que Tableau no sepa cómo hacer esto.

Hay muchachos en nuestro equipo que escriben en Python. Por lo tanto, en nuestra búsqueda decidimos movernos en esta dirección y encontramos TabPy .

TabPy es un servicio web que le permite obtener el resultado de ejecutar scripts de Python dentro de los costos en Tableau.

Cómo funciona

  1. Tableau interactúa con TabPy y, a su vez, con Python utilizando las llamadas Funciones de script. Las funciones de script contienen el script de Python en sí, el tipo de datos requerido del resultado y los argumentos que pasamos a esta función. En nuestro caso, los argumentos eran identificadores de "frutas", el número de amantes que queríamos contar.
  2. TabPy convierte el texto de Funciones de script recibido en un script y lo pasa al intérprete. La conexión a la base CH fue registrada por nosotros dentro del script.
  3. A continuación, TabPy devuelve el resultado de la secuencia de comandos ejecutada a Tableau.


imagen

En las funciones de script, los argumentos siempre se pasan como matrices; el resultado también es devuelto por una matriz.

No todo funcionó de inmediato. Lo principal que entendimos: escribir una secuencia de comandos de Python directamente en un campo calculado en Tableau no es una buena idea. Por dos razones:

  1. Dentro de las funciones de script, a veces es difícil usar la sintaxis familiar de Python. Por ejemplo, no se aceptan cotizaciones múltiples.
  2. Pensando en el soporte futuro para el tablero, nos dimos cuenta de que si necesitamos cambiar el script de alguna manera, cada vez tendremos que cambiarlo en el libro de Tableau. Y esta claramente no es la mejor manera, porque estamos haciendo todo lo posible para evitar el soporte manual para paneles.

Por lo tanto, utilizamos otra cosa: TabPy Client .

TabPy Client es una biblioteca que le permite publicar scripts de Python en el servidor TabPy y luego llamarlos dentro de Tableau. Al usarlo, en lugar de escribir un script dentro de Tableau, llamamos al archivo .py que se encuentra en el servidor TabPy usando los parámetros especificados en él, le pasamos argumentos y lo ejecutamos.

Este enfoque resolvió nuestros problemas usando TabPy y Tableau. El script está escrito y probado en el entorno de desarrollo familiar y se almacena por separado del libro, que ahora no requiere soporte manual.

Para resolver nuestro problema específico, tuvimos que hacer lo siguiente.
Al principio tratamos de resolverlo sin usar el cliente TabPy. En este caso, se creó un campo de cálculo de la siguiente forma dentro de Tableau:
SI PRIMERO () == 0
ENTONCES
SCRIPT_INT ("
desde clickhouse_driver import Client
cliente = Cliente (host = nombre de host, base de datos = nombre de base de datos, usuario = nombre de usuario, contraseña = contraseña)

----- script_text -----

", SUM ([personas]), ATTR ([fruits_id]))
Fin
Funcionó, pero hubo problemas que se describieron anteriormente. Cuando descubrimos el Cliente TabPy, nos dimos cuenta de que al dividir el campo Cálculo y el script en sí, obtenemos un sistema más conveniente y correcto. Así es como se veían el campo de cálculo y el archivo .py con el script:
Campo de cálculoSCRIPT_INT ("
return tabpy.query ('people_count_test', _ arg1, _arg2) ['respuesta']
", SUM ([personas]), ATTR ([fruits_id]))
Archivo de copiadesde clickhouse_driver import Client
import tabpy_client
connection = tabpy_client.Client ('http: // localhost: 9004 /')
def unique_people_count (people, fruits_id):
cliente = Cliente (host = nombre de host, base de datos = nombre de base de datos, usuario = nombre de usuario, contraseña = contraseña)

----- script_text -----

connection.deploy ('people_count_test', unique_people_count, 'comment', override = True)
Aquí puede ver que 'people_count_test' es el identificador para el cliente TabPy, gracias a lo cual está claro qué script ejecutar en este campo de cálculo.

Y al final, fue este enfoque el que nos satisfizo por completo.

imagen

Resumen


Los usuarios están satisfechos porque pueden elegir arbitrariamente una combinación de "frutas" y obtener rápidamente el número de fanáticos de al menos uno de ellos, y los números en diferentes partes del tablero son los mismos.

Los desarrolladores de BI están contentos de que pueda trabajar con ClickHouse de Tableau, sin tener que conectarse directamente.

Nuestro Tableau Server se complace en que no necesite hacer un gran extracto por la noche.

En general, TabPy ofrece a los desarrolladores de BI más libertad para trabajar con datos cuando Tableau no tiene una solución adecuada lista para usar. Por ejemplo, para incrustar modelos de ciencia de datos directamente en Tableau, pero esa es otra historia por completo ...

El artículo fue escrito conjuntamente con mis colegas Dimitry Scherbenko ( dima_vs ) y Sukhoveev Ivan ( suho_v ) I + D Dentsu Aegis Network Rusia.

Source: https://habr.com/ru/post/477864/


All Articles