Saltar a contenido

Conectar Superset a una base de datos

Ejercicio superset-first-connection-annex.pdf · PDF

La primera vez que juegas a un juego en línea, te pregunta cosas antes de dejarte entrar. ¿Qué servidor? ¿Qué mundo? ¿Tu cuenta? ¿Tu contraseña? Si te equivocas en una, te quedas en el vestíbulo mirando un mensaje de error.

Una base de datos hace exactamente lo mismo. En la última página viste que, de los seis tipos de fuente de datos, la base de datos relacional es la que más pide antes de abrirse. Hoy aprendes qué pide, por qué y cómo leer el error cuando la puerta sigue cerrada.

Después cruzas esa puerta: metes un conjunto de datos real en la base de datos y le haces tu primera pregunta.

Qué aprenderás

  • Nombrar las cinco cosas que necesita una conexión a una base de datos, más el driver, y decir para qué sirve cada una
  • Leer una cadena de conexión y encontrar cada una de esas partes dentro de ella
  • Saber por un mensaje de error qué ajuste está mal
  • Cargar un archivo CSV en una base de datos desde Superset
  • Ejecutar tus primeras consultas en SQL Lab
  • Evitar la trampa: pensar que Superset guarda tus datos o que localhost siempre significa "mi ordenador"

Superset no guarda tus datos

Empieza por la imagen, porque todo lo demás cuelga de ella.

flowchart LR
    B["<b>Tu navegador</b><br>lo que ves y pulsas"] -- "página web" --> S["<b>Superset</b><br>(el cliente del juego)<br>conecta, pregunta, dibuja"]
    S -- "SQL, a través<br>del driver" --> D[("<b>PostgreSQL</b><br>(el servidor del juego)<br>donde viven las filas")]
    D -- "filas" --> S

Aquí hay tres jugadores, y son tres programas distintos:

Programa En el juego Qué hace Qué guarda
Tu navegador La pantalla Muestra las páginas de Superset Nada
Superset El cliente del juego Se conecta a la base de datos, envía preguntas, dibuja las respuestas Sus propios ajustes: usuarios, conexiones guardadas, gráficos. No tus filas.
PostgreSQL El servidor del juego Guarda las tablas y responde preguntas sobre ellas Tus datos

Un servidor de base de datos es un programa que guarda datos en tablas y responde preguntas sobre ellas a cualquier programa que se conecte con los datos correctos. PostgreSQL es el que usamos.

Una conexión es el conjunto de datos que necesita un programa para llegar a un servidor de base de datos y que lo dejen entrar.

Superset es un cliente. Un cliente de juego sin servidor al que unirse te enseña un menú bonito y nada más. Por eso la primera tarea en Superset es siempre la misma: decirle dónde está el servidor.

Cuidado: \"Superset guarda mis datos\"

No. Superset guarda conexiones y gráficos. Las filas están en PostgreSQL. Si Superset desapareciera mañana, tus tablas seguirían ahí y cualquier otra herramienta con los datos de conexión correctos podría leerlas. Lo verás tú mismo al final de esta unidad, con Power BI.

Cinco cosas y un traductor

Toda conexión a una base de datos, en cualquier herramienta que uses, pide las mismas cinco cosas. Apréndelas una vez.

Ajuste La pregunta que responde En el juego Aspecto
Host ¿En qué máquina está la base de datos? A qué servidor te unes Un nombre o un número: db.example.com
Puerto ¿Por qué puerta de esa máquina? Qué puerta de ese servidor Un número: 5432
Base de datos ¿Qué base de datos de ese servidor? Qué mundo de ese servidor Un nombre: shop
Usuario ¿Quién eres? Tu cuenta Un nombre: your_user
Contraseña ¿Puedes demostrarlo? La contraseña de tu cuenta Secreta. Nunca se muestra en una página como esta.

Tres de esas palabras son nuevas:

  • El host es el nombre o la dirección de red de la máquina donde funciona el servidor de la base de datos.
  • Un puerto es una puerta numerada de una máquina. Una máquina puede ejecutar muchos programas que escuchan a la red, y cada uno espera tras su propio número. La puerta habitual de PostgreSQL es la 5432. La página web de Superset usa otra, la 8088: no las confundas.
  • Un servidor de base de datos puede contener varias bases de datos separadas, como un servidor de juego que aloja varios mundos. Tienes que decir cuál quieres.

Y luego hay una sexta cosa que ningún formulario te pide escribir:

Un driver es un pequeño programa que permite a un programa hablar con un tipo concreto de base de datos.

Superset habla SQL. Pero PostgreSQL, MySQL y las demás esperan que ese SQL llegue por la red a su manera. El driver es el traductor. El driver de Superset para PostgreSQL se llama psycopg2; para MySQL necesitaría otro distinto.

Cuidado: \"la contraseña es correcta, así que tiene que conectar\"

No sin el driver. Si el traductor no está instalado, Superset no puede decirle ni una palabra a esa base de datos, por muy correcta que sea la contraseña. En Superset lo notas pronto: una base de datos cuyo driver falta no aparece en la lista de bases de datos a las que puedes conectarte.

Las cinco en una línea: la cadena de conexión

Escribir cinco casillas es una manera de dar los datos. La otra es una línea de texto.

Una cadena de conexión es una sola línea que contiene todos los datos de una conexión, en un orden fijo.

Para PostgreSQL en Superset tiene este patrón:

postgresql://USER:PASSWORD@HOST:PORT/DATABASE

Con valores inventados, para que veas dónde va cada parte:

postgresql://your_user:your_password@db.example.com:5432/shop
Pieza Ajuste
postgresql:// El tipo de base de datos, que le dice a Superset qué driver usar
your_user Usuario
your_password Contraseña
db.example.com Host
5432 Puerto
shop Base de datos

Lee la puntuación y podrás descifrar cualquier cadena de conexión: :// después del tipo de base de datos, : entre usuario y contraseña, @ antes del host, : antes del puerto, / antes de la base de datos.

Una cadena de conexión es una contraseña

Mira otra vez el segundo ejemplo: la contraseña está ahí, en texto plano. Una cadena de conexión es la llave de toda la base de datos. No pegues nunca una en un chat, una captura de pantalla, una pregunta de foro ni un archivo que compartas. Los valores de esta página están inventados a propósito; los tuyos te los dan en clase y se quedan ahí.

Dónde se pone en Superset

En Superset, una conexión se crea una sola vez y luego todos los que usan ese Superset trabajan a través de ella. En tu VM de clase ya existe, con el nombre Dades classe. Así se crea una, para que sepas qué estás mirando.

Paso Haz esto Deberías ver
1 Settings → Database Connections La lista de conexiones que conoce Superset
2 + Database, luego elige PostgreSQL Un formulario con las casillas Host, Port, Database name, Username, Password y Display Name
3 Rellena los cinco ajustes y un Display Name: la etiqueta que verá la gente
4 Pulsa Connect Superset prueba la conexión. Si algún dato es incorrecto, aquí aparece un error.
5 Edita la conexión (icono del lápiz) → Advanced → Security → marca Allow file uploads to database → Finish En la lista: la conexión, su backend postgresql y una marca en File upload

El paso 5 no es uno de los cinco ajustes. Es un permiso: un interruptor del lado de Superset que decide qué puede hacer la gente a través de esta conexión. Sin él, nadie puede cargar un archivo en esa base de datos desde Superset.

Así que la lista completa para "configurar el acceso" es: host, puerto, base de datos, usuario, contraseña, driver y permisos.

Leer el error

Las conexiones fallan. Es normal, y el mensaje de error no es ruido: te dice hasta dónde llegaste.

Lo que ves Hasta dónde llegaste El ajuste que comprobar
El tipo de base de datos no está en la lista A ningún sitio: no hay traductor Driver
Un mensaje que contiene Connection refused Llamaste y no había nadie tras esa puerta Host o puerto
Un mensaje que dice que la contraseña de tu usuario es incorrecta Llegaste al servidor y dijo que no Usuario o contraseña
La conexión funciona, pero no aparece en el formulario de subida Estás dentro, pero no tienes permiso para hacer eso Permiso: Allow file uploads
La subida funciona, pero la tabla tiene una sola columna No es un problema de conexión en absoluto El separador del archivo

¿Qué es mejor noticia: connection refused o contraseña incorrecta? Contraseña incorrecta. Significa que el host y el puerto eran correctos y que un servidor respondió. Estás a un error de tecleo. Connection refused significa que ni siquiera has encontrado todavía el servidor.

Cuidado: localhost no siempre es tu ordenador

localhost es un nombre de host especial que significa "esta misma máquina": la máquina donde se ejecuta el programa que usa la palabra. También puedes verlo escrito como el número 127.0.0.1.

Cuando tú escribes localhost en tu navegador, significa tu ordenador. Pero en un formulario de conexión, el programa que usará la palabra es Superset, y Superset se ejecuta en un servidor. Así que ahí localhost significa "busca la base de datos dentro de la máquina donde se ejecuta el propio Superset". Si la base de datos está en otro sitio, Superset llama a su propia puerta, no encuentra a nadie e informa connection refused.

En el juego: "esta consola" es siempre la tuya. Para llegar a la de un amigo, necesitas su gamertag. El host es el gamertag.

Así que cuando veas connection refused, no concluyas que la base de datos está apagada. Normalmente está encendida y el host es el equivocado.

Cargar un CSV en la base de datos

En la última página descargaste pokemon_df.csv. Un archivo en tu disco es botín en tu mochila. Para consultarlo con SQL, tiene que convertirse en una tabla de la base de datos.

Superset puede hacerlo por ti: lee el archivo y crea la tabla en PostgreSQL, a través de la conexión.

Paso Haz esto Deberías ver
1 + (arriba a la derecha) → Data → Upload CSV to database El formulario de subida
2 CSV file: elige pokemon_df.csv
3 Database: Dades classe Si no está en la lista, falta el permiso Allow file uploads
4 Schema: public. No lo dejes nunca vacío. Si se deja vacío, la subida falla con schema "undefined" does not exist
5 Table name: pokemon. Corto, en minúsculas, sin espacios.
6 Delimiter: compruébalo con el archivo. El nuestro usa una coma.
7 Upload Datasets ahora lista pokemon

Dos palabras nuevas:

  • Un esquema (schema) es una carpeta de tablas dentro de una base de datos. public es el que PostgreSQL te da desde el principio.
  • Un dataset es el nombre que da Superset a "algo con lo que puedo construir gráficos". Aquí es una etiqueta que apunta a tu nueva tabla. Conocerás bien los datasets en Datasets y destino.

El paso 6 es donde la página anterior da sus frutos. Si tu archivo usa ; entre valores y el formulario sigue diciendo ,, la subida "funciona" y obtienes una tabla con una sola columna muy ancha. Y si los números usan coma decimal, pon también File settings → Decimal character en ,.

Cuidado: \"la subida estropeó mis datos\"

No lo hizo. El archivo está bien; a la herramienta se le dijo el separador o la marca decimal equivocados. Borra la tabla y vuelve a subir con los ajustes correctos. Nada del archivo original ha cambiado.

Una cosa que hace la subida en silencio: en nuestro archivo, un valor ausente se escribe con las dos letras NA. Superset carga esas celdas como NULL, la forma que tiene la base de datos de decir "aquí no hay valor". Charmander solo tiene un tipo, así que su type_2 es NULL. Ese es tu primer contacto con los valores ausentes, el gran tema de UT2.

Primeras preguntas en SQL Lab

SQL (Structured Query Language, lenguaje de consulta estructurado) es el lenguaje para hacer preguntas a una base de datos relacional. Una pregunta se llama consulta.

SQL Lab es la página de Superset donde escribes una consulta, la ejecutas y ves la respuesta como una tabla.

Abre SQL → SQL Lab. A la izquierda elige la base de datos Dades classe y el esquema public. Luego haz tres preguntas, una por una, pulsando Run después de cada una.

¿Cuántas filas hay?

SELECT COUNT(*) FROM pokemon;
count
949

SELECT significa "muéstrame", FROM pokemon dice qué tabla y COUNT(*) cuenta filas. 949 Pokémon: el mismo número que contaste en el editor de texto. El archivo entero llegó.

¿Qué aspecto tienen las filas?

SELECT * FROM pokemon LIMIT 10;

El * significa "todas las columnas" y LIMIT 10 significa "para después de diez filas". Obtienes 10 filas y 22 columnas. Estas son las primeras cuatro filas y algunas de las columnas:

id pokemon height weight type_1 type_2 hp attack
1 bulbasaur 0.7 6.9 grass poison 45 49
2 ivysaur 1 13 grass poison 60 62
3 venusaur 2 100 grass poison 80 82
4 charmander 0.6 8.5 fire NULL 39 52

Ejecuta siempre esta en una tabla que no hayas visto nunca. Cuesta un segundo y te muestra los nombres de las columnas, el tipo de valor de cada una y sorpresas como ese NULL.

¿Qué tipo golpea más fuerte?

SELECT type_1, COUNT(*) AS n, ROUND(AVG(attack)) AS avg_attack
FROM pokemon
GROUP BY type_1
ORDER BY avg_attack DESC;

La respuesta tiene 18 filas, una por tipo. Las cinco primeras:

type_1 n avg_attack
dragon 39 109
fighting 31 99
ground 36 96
steel 30 93
rock 65 90

Léela como una frase: para cada tipo principal, cuenta los Pokémon y haz la media de su ataque, luego ordena de la media más alta hacia abajo. Los tipos dragón golpean más fuerte, con un ataque medio de 109. El tipo más común, water, tiene 126 Pokémon, pero está muy abajo en la lista con una media de 75.

No te preocupes si esa tercera consulta parece mucho. GROUP BY es la única idea realmente nueva que contiene y tiene su propia página: SQL Lab: grupos.

Fíjate en lo que acaba de pasar. En el juego de crafteo, esto fue toda la etapa 1: encontraste el botín (un CSV en una web), te lo llevaste a casa (la subida) y lo guardaste donde puedes trabajar con él (una tabla). Y hiciste una pregunta que un editor de texto nunca podría responder.

Pruébalo: tu primera conexión

En tu VM de clase, con Superset abierto en el navegador:

Paso Haz esto Deberías ver
1 Abre Settings → Database Connections y busca Dades classe Backend postgresql y una marca en File upload
2 Abre Datasets. Si pokemon no aparece, sube pokemon_df.csv como se explica arriba. pokemon en la lista
3 En SQL Lab, ejecuta las tres consultas de esta página 949; diez filas; dragon arriba con 109
4 Cambia la tercera consulta para usar type_2 en lugar de type_1 (en los tres sitios) Una clasificación distinta, con fighting arriba con 112 y una fila donde el tipo es NULL
5 Escribe, sin mirar: los cinco ajustes de una conexión y la sexta cosa Host, puerto, base de datos, usuario, contraseña; y el driver

Si descargaste tu propio conjunto de datos en la búsqueda de datos abiertos, súbelo también, con su propio nombre de tabla, y adapta la tercera consulta a la pregunta que escribiste en tu ficha.

Ideas clave

  • Superset es un cliente: conecta, pregunta y dibuja. Tus filas viven en el servidor de base de datos (PostgreSQL), no en Superset.
  • Una conexión necesita cinco cosas: host, puerto, base de datos, usuario y contraseña. El puerto habitual de PostgreSQL es el 5432.
  • El driver es el traductor entre una herramienta y un tipo de base de datos. Sin driver no hay conexión, ni siquiera con la contraseña correcta.
  • Una cadena de conexión empaqueta todo en una línea, contraseña incluida. Trátala como un secreto.
  • Los mensajes de error dicen hasta dónde llegaste: connection refused apunta al host o al puerto; contraseña incorrecta significa que ya llegaste al servidor.
  • localhost significa "la máquina donde se ejecuta este programa". Para Superset, es su propio servidor, no tu ordenador.
  • Subir un CSV crea una tabla real en la base de datos. Comprueba el esquema y el delimitador en el formulario. Luego hazle preguntas en SQL Lab.

Comprobación rápida

1. ¿Qué lista contiene los cinco ajustes de una conexión a una base de datos?
  • Host, puerto, driver, navegador, contraseña
  • Host, puerto, base de datos, usuario, contraseña
  • Archivo, separador, codificación, hoja, cabecera
  • Servidor, esquema, tabla, columna, fila

Host (qué máquina), puerto (qué puerta), base de datos (qué mundo), usuario y contraseña (tu cuenta). El driver es la sexta cosa, pero no la escribes en el formulario: es software que debe estar instalado.

2. ¿Para qué sirve el driver?
  • Guarda la contraseña para que no tengas que escribirla de nuevo
  • Hace que las consultas se ejecuten más rápido
  • Permite a un programa hablar con un tipo concreto de base de datos
  • Convierte archivos CSV en tablas

El driver es el traductor. Superset habla SQL, pero cada tipo de base de datos lo espera a su manera por la red. Sin el driver correcto, Superset no puede hablar en absoluto con esa base de datos.

3. En la cadena de conexión postgresql://ana:s3cret@data.example.org:5432/library, ¿cuál es el host?
  • ana
  • library
  • data.example.org
  • postgresql

El patrón es postgresql://USER:PASSWORD@HOST:PORT/DATABASE. El host viene después de la @ y antes de los : del puerto. Aquí el usuario es ana, el puerto es 5432 y la base de datos es library. Y sí: la contraseña se lee en medio, por eso una cadena de conexión es un secreto.

4. Superset muestra un mensaje que dice que la contraseña de tu usuario es incorrecta. ¿Qué te dice eso?
  • El servidor de base de datos está apagado
  • El driver no está instalado
  • El host y el puerto son correctos: llegaste al servidor y rechazó el inicio de sesión
  • El archivo CSV tiene el separador equivocado

Para rechazar una contraseña, un servidor primero tiene que responder. Así que host y puerto están bien y el problema está en el usuario o la contraseña. Es mejor noticia que connection refused, donde todavía no has encontrado el servidor.

5. ¿Dónde se guardan las 949 filas de Pokémon después de subir el CSV desde Superset?
  • Dentro de Superset, junto a los gráficos
  • En tu navegador
  • En una tabla de la base de datos PostgreSQL
  • Solo en el archivo CSV original

Superset lee el archivo y crea una tabla en la base de datos, a través de la conexión. Superset en sí solo guarda sus ajustes: usuarios, conexiones y gráficos. Cualquier otra herramienta con los datos de conexión correctos podría leer esa tabla.

6. ¿Qué devuelve SELECT COUNT(*) FROM pokemon;?
  • La primera fila de la tabla
  • Los nombres de las columnas
  • Un número: cuántas filas tiene la tabla
  • Todas las filas de la tabla

COUNT(*) cuenta filas, así que la respuesta es un único número: 949. Para ver filas escribirías SELECT * FROM pokemon LIMIT 10;.

7. Un amigo usa Superset en un servidor para llegar a una base de datos MySQL de otro servidor llamado botiga. La casilla del host dice 127.0.0.1 y Superset responde connection refused. Elige las dos afirmaciones verdaderas.
  • 127.0.0.1 significa "esta misma máquina", así que Superset busca MySQL en su propio servidor; el host debería ser botiga
  • La contraseña es incorrecta: connection refused siempre significa contraseña errónea
  • Superset también necesita tener instalado un driver de MySQL, o no puede hablar con MySQL en absoluto
  • MySQL no se puede usar desde Superset, solo PostgreSQL

127.0.0.1 es localhost escrito como número: la máquina donde se ejecuta el programa. Superset llamó a su propia puerta. Connection refused apunta al host o al puerto, no a la contraseña. Y cada tipo de base de datos necesita su propio driver: el de PostgreSQL no habla MySQL.

La puerta está abierta y la tabla está dentro. Hasta ahora lo pedías todo; a continuación aprendes a pedir exactamente las filas que necesitas: SQL Lab: filtros.