Skip to content

Obtener datos de la API REST de Snowflake usando Python: Tutorial completo

En el mundo de la almacenamiento de datos, Snowflake ha surgido como una plataforma líder, ofreciendo una multitud de conectores compatibles con los estándares de la industria en varios lenguajes de programación. Uno de estos conectores es la API REST de Snowflake, que es independiente del lenguaje y permite una interacción sin problemas con la plataforma Snowflake. Este artículo tiene como objetivo proporcionar una guía completa sobre cómo obtener datos de la API REST de Snowflake usando Python, un lenguaje de programación popular conocido por su simplicidad y robustez.

Python, con su rico ecosistema de bibliotecas y marcos de trabajo, es una excelente opción para interactuar con la API REST de Snowflake. Ya sea que utilices el conector de Python, que es compatible con PEP 249, o aproveches la API REST de Snowpipe para la carga de datos, Python ofrece una variedad de posibilidades. Este artículo profundizará en los detalles de estas interacciones, proporcionando ejemplos prácticos y abordando preguntas frecuentes.

¿Quieres visualizar rápidamente los datos de Snowflake? ¡Puede que quieras echar un vistazo a RATH (opens in a new tab)!

Enlace de RATH en GitHub: https://github.com/Kanaries/Rath (opens in a new tab)

Imagina que puedes limpiar e importar fácilmente tus datos almacenados en Snowflake, generar conocimientos sobre los datos con visualización de forma rápida y eficiente, y realizar análisis exploratorios de datos sin programación complicada. Eso es exactamente para lo que está diseñado RATH.

Mira la siguiente demostración de RATH identificando rápidamente anomalías en los datos con la función Data Painter (opens in a new tab):


¿Interesado? ¡RATH tiene más características avanzadas que te sorprenderán! ¡Visita el sitio web de RATH (opens in a new tab) para obtener más detalles ahora mismo!

Parte 1: Entendiendo Snowflake y la API REST

Snowflake es una plataforma de almacenamiento de datos basada en la nube que proporciona una multitud de conectores compatibles con los estándares de la industria en cada lenguaje de programación. Uno de estos conectores es la API REST, que es agnóstica con respecto al lenguaje de programación. Esto significa que puedes usar cualquier lenguaje de programación para interactuar con Snowflake a través de la API REST, lo que la convierte en una elección versátil y flexible para los desarrolladores.

La API REST funciona enviando solicitudes HTTP al servidor de Snowflake y recibiendo respuestas HTTP. Esta interacción te permite realizar diversas operaciones, como la carga de datos, la consulta de datos y la gestión de tu cuenta de Snowflake. Por ejemplo, puedes usar la API REST para autenticar tu sesión, emitir consultas SQL, supervisar el estado de tus consultas y recuperar los resultados de las consultas.

Parte 2: Usar Python con la API REST de Snowflake

Python es un lenguaje de programación poderoso que se utiliza ampliamente en el análisis de datos, el aprendizaje automático, el desarrollo web y más. Su simplicidad y legibilidad lo convierten en una elección popular entre los desarrolladores. Cuando se trata de interactuar con la API REST de Snowflake, Python ofrece varias ventajas.

En primer lugar, Python tiene un rico ecosistema de bibliotecas que pueden simplificar el proceso de envío de solicitudes HTTP y manejo de respuestas HTTP. Bibliotecas como requests y http.client proporcionan funciones fáciles de usar para estas tareas. En segundo lugar, el soporte de Python para JSON (JavaScript Object Notation) es invaluable cuando se trabaja con API REST, ya que JSON se utiliza comúnmente para estructurar datos en solicitudes y respuestas de la API.

En el contexto de Snowflake, Python se puede utilizar para enviar consultas SQL a la API REST, manejar las respuestas y manipular los datos devueltos. Por ejemplo, puedes usar Python para emitir una consulta SQL a Snowflake, recuperar los resultados de la consulta en formato JSON y luego usar la biblioteca json para analizar los datos JSON.

Parte 3: Ejemplo práctico de usar Python con la API REST de Snowflake

Sumergámonos en un ejemplo práctico de cómo puedes usar Python para interactuar con la API REST de Snowflake. En este ejemplo, nos centraremos en el proceso de autenticar una sesión, emitir una consulta SQL y recuperar los resultados de la consulta.

En primer lugar, debes autenticar tu sesión enviando una solicitud POST al endpoint /session/v1/login-request. El cuerpo de la solicitud debe incluir los detalles de tu cuenta y las credenciales de Snowflake. Si la autenticación tiene éxito, recibirás una respuesta que contiene un token, que utilizarás en las solicitudes posteriores a la API.

A continuación, puedes emitir una consulta SQL enviando una solicitud POST al endpoint /queries/v1/query-request.

Después de emitir la consulta SQL, recibirás una respuesta que incluye el ID de la consulta y una bandera de éxito. La bandera de éxito indica si el sistema ha aceptado la consulta, pero no proporciona información sobre el estado de ejecución de la consulta.

Para verificar el estado de la consulta, puedes enviar una solicitud GET al endpoint /monitoring/queries/{query-id}, pasando el ID de la consulta en la URL. Si la consulta se ha ejecutado correctamente, recibirás una respuesta que indica que la consulta fue exitosa.

Finalmente, para recuperar los resultados de la consulta, puedes enviar otra solicitud POST al endpoint /queries/v1/query-request, esta vez pasando el ID de la consulta en el texto SQL del cuerpo de la solicitud. La respuesta contendrá los resultados de la consulta en el campo rowset del objeto data.

Aquí tienes un ejemplo simplificado de cómo podrías implementar este proceso en Python:

import requests
 
import json
 
## Autenticar la sesión
auth_url = "https://{cuenta}.{region}.snowflakecomputing.com/session/v1/login-request?warehouse={almacen}"
auth_data = {
    "data": {
        "CLIENT_APP_ID": "lightweight-client",
        "CLIENT_APP_VERSION": "0.0.1",
        "ACCOUNT_NAME": "...",
        "LOGIN_NAME": "...",
        "PASSWORD": "..."
    }
}
auth_response = requests.post(auth_url, data=json.dumps(auth_data))
token = auth_response.json()["data"]["token"]
 
## Emitir una consulta de SQL
query_url = "https://{cuenta}.{region}.snowflakecomputing.com/queries/v1/query-request?requestId={uuid-aleatorio}"
query_headers = {"Authorization": f"Snowflake Token=\"{token}\""}
query_data = {
    "sqlText": "SELECT * FROM my_table",
    "asyncExec": True,
    "sequenceId": 1,
    "querySubmissionTime": 1635322866647
}
query_response = requests.post(query_url, headers=query_headers, data=json.dumps(query_data))
query_id = query_response.json()["data"]["queryId"]
 
## Verificar el estado de la consulta
status_url = f"https://{cuenta}.{region}.snowflakecomputing.com/monitoring/queries/{query_id}"
status_response = requests.get(status_url, headers=query_headers)
status = status_response.json()["data"]["queries"][0]["status"]
 
## Recuperar los resultados de la consulta
if status == "SUCCESS":
    results_url = "https://{cuenta}.{region}.snowflakecomputing.com/queries/v1/query-request?requestId={uuid-aleatorio}"
    results_data = {
        "sqlText": f"SELECT * FROM table(result_scan('{query_id}'))",
        "asyncExec": False,
        "sequenceId": 1,
        "querySubmissionTime": 1635066639000
    }
    results_response = requests.post(results_url, headers=query_headers, data=json.dumps(results_data))
    results = results_response.json()["data"]["rowset"]

Este ejemplo demuestra el proceso básico de interacción con la API REST de Snowflake usando Python. Sin embargo, ten en cuenta que este es un ejemplo simplificado y la implementación real puede requerir un manejo adicional de errores y otras consideraciones.

Parte 4: Manejo de conjuntos de resultados grandes

Cuando se trabaja con conjuntos de datos grandes, la respuesta devuelta por la API REST de Snowflake puede no contener filas en el arreglo rowset. En su lugar, contiene chunkHeaders y chunks. Estos chunks son básicamente objetos cifrados y descargables almacenados en S3. Los objetos tienen el mismo formato JSON que tendría rowset.

Así es como puedes manejar conjuntos de resultados grandes en Python:

## Verificar si la respuesta contiene chunks
if "chunks" in results_response.json()["data"]:
    chunks = results_response.json()["data"]["chunks"]
    chunk_headers = results_response.json()["data"]["chunkHeaders"]
 
    ## Descargar y descifrar cada chunk
    for chunk in chunks:
        chunk_url = chunk["url"]
        chunk_response = requests.get(chunk_url, headers=chunk_headers)
        chunk_data = chunk_response.json()
 
        ## Procesar los datos del chunk
        for row in chunk_data["rowset"]:
            procesar_fila(row)

Este código verifica si la respuesta contiene chunks. Si es así, descarga y descifra cada chunk, luego procesa los datos en cada chunk.

Parte 5: Uso de la API REST de Snowpipe para la carga de datos

Snowpipe es un servicio proporcionado por Snowflake para cargar datos en tu almacén de datos de Snowflake. Está diseñado para cargar los datos tan pronto como lleguen a tu almacenamiento basado en la nube. Snowpipe utiliza la API REST de Snowflake, lo que te permite automatizar el proceso de carga de datos.

Aquí tienes un ejemplo básico de cómo puedes usar Python para interactuar con la API REST de Snowpipe:

## Definir la URL de la API REST de Snowpipe
snowpipe_url = "https://{cuenta}.{region}.snowflakecomputing.com/v1/data/pipes/{nombre_pipa}/insertFiles"
 
## Definir las cabeceras de la solicitud
headers = {
    "Authorization": f"Snowflake Token=\"{token}\"",
    "Content-Type": "application/json"
}
 
## Definir el cuerpo de la solicitud
body = {
    "files": [
        "s3://mi-bucket/mi-archivo.csv"
    ]
}
 
## Enviar la solicitud a la API REST de Snowpipe
response = requests.post(snowpipe_url, headers=headers, data=json.dumps(body))
 
## Verificar la respuesta
if response.status_code == 200:
    print("La carga de datos se inició correctamente.")
else:
    print(f"No se pudo iniciar la carga de datos: {response.json()['message']}")

Este código envía una solicitud a la API REST de Snowpipe para comenzar a cargar datos desde un archivo especificado en tu depósito de S3. La respuesta de la API REST de Snowpipe indicará si el proceso de carga de datos se inició correctamente.

Conclusión

En conclusión, obtener datos de la API REST de Snowflake usando Python es una manera poderosa de aprovechar las capacidades de Snowflake y Python. Ya sea que cargues datos, consultes datos o administres tu cuenta de Snowflake, Python proporciona una forma robusta y flexible de interactuar con la API REST de Snowflake. Con los ejemplos prácticos y las preguntas frecuentes proporcionadas en este artículo, deberías tener un buen entendimiento de cómo comenzar con la API REST de Snowflake y Python. ¡Feliz codificación!

Preguntas frecuentes

¿Cómo se extraen datos de Snowflake en Python?

Puedes extraer datos de Snowflake en Python utilizando el Conector de Python de Snowflake o la API REST de Snowflake. El Conector de Python permite interactuar con Snowflake utilizando la especificación de API de base de datos de Python (PEP 249), mientras que la API REST te permite enviar solicitudes HTTP para realizar diversas operaciones en Snowflake.

¿Puede Snowflake extraer datos de una API?

Sí, Snowflake puede extraer datos de APIs utilizando funciones externas. Estas funciones permiten que Snowflake llame a una API externa y recupere datos durante una consulta. Además, puedes usar la API REST de Snowflake para interactuar con tu cuenta de Snowflake y realizar operaciones como la carga de datos y la consulta de datos.

¿Cuál es la conexión API de Snowflake en Python?

La conexión de la API de Snowflake en Python se refiere a la conexión establecida entre su aplicación Python y Snowflake utilizando el Conector de Python de Snowflake o la API REST de Snowflake. Esta conexión permite que su aplicación Python interactúe con Snowflake, lo que permite realizar operaciones como la carga de datos, la consulta de datos y la gestión de cuentas.