Klarety

Ejecutar SQL

Ejecute Spark SQL en Nexus con parámetros, estimaciones y páginas de resultados.

Para desarrolladores

nexus.sql() ejecuta una sentencia de en y espera la respuesta. En la app, las mismas consultas se ejecutan en DatosEditor SQL. Para scripts largos o procesamiento pesado, vea Sesiones de Spark y Trabajos.

Antes de empezar

  • El SDK está instalado y usted puede conectarse (Inicio rápido del SDK).
  • El Acceso de su clave permite lo que hace la sentencia. Una clave de solo lectura solo puede leer.
  • El espacio de trabajo tiene créditos.

Ejecute una consulta

top_customers.py
from klarety import Nexus, RefusedError, ServiceError

with Nexus.connect() as nexus:
    try:
        result = nexus.sql(
            "SELECT customer, SUM(amount) AS total "
            "FROM orders GROUP BY customer ORDER BY total DESC",
            max_rows=10,
        )
    except RefusedError as refused:
        raise SystemExit(f"Query refused: {refused}")
    except ServiceError as failed:
        raise SystemExit(f"Nexus could not answer, try again: {failed}")

    for row in result.rows:
        print(row["customer"], row["total"])
    print(f"Read {result.bytes_scanned} bytes")

Las tablas sin nombre de se leen de default. Nombre otro esquema como esquema.tabla.

Qué se devuelve

sql() devuelve un ResultSet:

CampoSignificado
rowsLas filas, cada una un diccionario por nombre de columna. len(result) es el número de filas.
bytes_scannedCuántos datos leyó la sentencia.
truncatedTrue cuando la sentencia produjo más filas de las devueltas.
result_idSe define cuando el resto del resultado se guardó aparte para leerlo página por página.
pagesCuántas páginas se guardaron aparte.
result_truncatedTrue cuando incluso el resultado guardado superó el tamaño de su plan, así que solo se guarda la primera parte.

Dos tipos de valor requieren cuidado:

  • Un número entero mayor que 253 llega como texto, para que ningún lector JSON lo redondee. Conviértalo con int().
  • Un valor timestamptz llega en UTC sin desplazamiento escrito. Agregue Z antes de que lo lea un analizador estricto.

Pase valores con parámetros

Nunca una la entrada del usuario al SQL. Use params: cada :nombre se llena como literal de texto, nunca se lee como SQL.

result = nexus.sql(
    "SELECT * FROM orders WHERE customer = :customer AND amount > CAST(:minimum AS DOUBLE)",
    params={"customer": "Acme", "minimum": "100"},
)

Cada valor es texto; use CAST para números y fechas en el SQL, como arriba. Un nombre de parámetro empieza con una letra o guion bajo y tiene hasta 64 letras, dígitos o guiones bajos; una sentencia acepta hasta 256 parámetros.

Controle cuántas filas se devuelven

max_rows limita las filas devueltas: de 1 a 10.000, 1.000 por defecto, nunca más que la página de filas de su plan. Si hay más, truncated es True.

Lea un resultado grande

Cuando un resultado no cabe en una respuesta, Nexus guarda el resto un día y define result_id. nexus.result_rows(result) lee todas las filas página por página, sin cargarlo todo en memoria:

result = nexus.sql("SELECT * FROM events WHERE day = '2026-11-01'")

if result.truncated:
    count = 0
    for row in nexus.result_rows(result):
        count += 1
    print(f"{count} rows in total")

Si result_id es None, result_rows() devuelve las filas que tiene, así que siempre es seguro llamarlo.

Estime antes de ejecutar

nexus.estimate() indica cuánto leería una sentencia, sin ejecutarla ni cobrarla:

estimate = nexus.estimate("SELECT * FROM events")
print(estimate["bytes_scanned"], estimate["allowed_bytes"], estimate["within_budget"])

Si within_budget es False, sería rechazada con OverBudgetError. Agregue un WHERE sobre una columna por la que esté organizada la tabla, seleccione menos columnas o agregue primero.

Inicie Nexus con anticipación

Tras un periodo sin actividad, la primera sentencia puede esperar mientras Nexus arranca. Antes de una ráfaga conocida (por ejemplo, al iniciar su app), llame a nexus.warm(); responde de inmediato y arranca Nexus en segundo plano. nexus.spark_status() le dice si está apagado, arrancando, listo u ocupado.

Reintentos y tiempos de espera

No necesita escribir ciclos de reintento alrededor de sql():

  • Cada sentencia lleva un ID elegido por el SDK. Si la conexión se cae, el SDK la reenvía con el mismo ID, y Nexus la ejecuta una sola vez.
  • Cuando todos los espacios que permite su plan están ocupados, o Nexus está arrancando, el SDK espera y reintenta hasta por cinco minutos.
  • Una sentencia que no terminó en ese tiempo lanza AnswerNotReadyError. Ejecútela de nuevo: nada se ejecutó dos veces.

Qué puede salir mal

ExcepciónCausaQué hacer
RefusedErrorLa sentencia no está permitida para esta clave, o el SQL no es válido. El mensaje dice cuál.Corrija la sentencia o use una clave con más acceso.
OverBudgetErrorLa sentencia leería más de lo que permite su plan.Acótela y verifique con estimate().
RateLimitedErrorDemasiadas llamadas por minuto.El SDK ya esperó; haga su ciclo más lento.
OverBudgetError (ocupado)Todos los espacios están tomados y la cola está llena.Envíela de nuevo en un momento.
InsufficientCreditsErrorEl espacio de trabajo no tiene créditos.Agregue créditos.
AnswerNotReadyErrorNo hubo respuesta dentro del tiempo de espera.Pregunte de nuevo.

Próximos pasos

En esta página