Hoy, nos complace anunciar la versión preliminar pública de la API de ejecución de declaraciones SQL de Databricks, disponible en AWS y Azure. Ahora puede conectarse a su Bloques de datos SQL almacén sobre una API REST para acceder y manipular datos administrados por el Plataforma Lakehouse de ladrillos de datos.
La API de ejecución de declaraciones SQL de Databricks simplifica el acceso a sus datos y facilita la creación de aplicaciones de datos adaptadas a sus necesidades. La API es asíncrona, lo que elimina la necesidad de administrar conexiones como lo hace con JDBC u ODBC. Además, puede conectarse a su almacén de SQL sin tener que instalar primero un controlador. Puede usar la API de ejecución de declaraciones para conectar sus aplicaciones, servicios y dispositivos tradicionales y basados en la nube a Databricks SQL. También puede crear bibliotecas de clientes personalizadas para el lenguaje de programación que elija.
En este weblog, revisamos algunas funciones clave disponibles en la vista previa pública y mostramos cómo aprovechar sus datos en una hoja de cálculo utilizando la API de ejecución de declaraciones y JavaScript.
Resumen de la API de ejecución de sentencias
La API de ejecución de declaraciones gestiona la ejecución de Sentencias SQL y obtención de datos de resultados en todo tipo de Bloques de datos SQL almacenes a través de puntos finales HTTP para las siguientes operaciones:
Envíe una declaración SQL para su ejecución | POST /sql/declaraciones |
Comprobar el estado y recuperar resultados | OBTENER /sql/declaraciones/{statement_id} |
Cancelar la ejecución de una sentencia SQL | POST /sql/declaraciones/{statement_id}/cancelar |
Por ejemplo, supongamos que queremos recuperar los ingresos por pedidos mensuales del año en curso para mostrarlos en nuestra aplicación de datos. Suponiendo que Lakehouse ya administre los datos de los pedidos, una declaración SQL podría ser como se muestra a continuación:
SELECT
month(o_orderdate) as Month,
sum(o_totalprice) as `Month-to-month Income`
FROM `samples`.`tpch`.`orders`
WHERE yr(o_orderdate) == yr(current_date())
GROUP BY 1
ORDER BY 1
Podemos iniciar la ejecución de nuestra instrucción SQL enviando un CORREO solicitud a la /api/2.0/sql/statements
punto remaining La cadena que representa la instrucción SQL se proporciona como una carga útil del cuerpo de la solicitud, junto con el ID de un Almacén de SQL que se utilizará para ejecutar la instrucción. La solicitud HTTP también debe contener el componente de host de la URL del área de trabajo de Databricks y un token de acceso para la autenticación.
POST /api/2.0/sql/statements HTTP/1.1
Host: <your_HOST>
Authorization: Bearer <your_access_token>
Content material-Kind: utility/json
{
"assertion": "SELECT month(o_orderdate) as Month, sum(o_totalprice) as `Month-to-month Income` FROM `samples`.`tpch`.`orders` WHERE yr(o_orderdate) == yr(current_date()) GROUP BY 1 ORDER BY 1",
"warehouse_id": "<your_SQL_warehouse_ID>"
}
Si la instrucción se completa rápidamente, la API devuelve los resultados como respuesta directa a la solicitud POST. A continuación se muestra un ejemplo de respuesta:
{
"statement_id": "01ed9a57-ad5e-1333-8e76-8c718723abf2",
"standing": {
"state": "SUCCEEDED"
},
"manifest": {
"format": "JSON_ARRAY",
"schema": {
"column_count": 2,
"columns": (
{
"identify": "Month",
"type_name": "INT",
"place": 0
},
{
"identify": "Month-to-month Income",
"type_name": "DECIMAL",
"place": 1,
"type_precision": 28,
"type_scale": 2
}
)
}
},
"outcome": {
"chunk_index": 0,
"row_offset": 0,
"row_count": 2,
"data_array": (
(
"1",
"14615808096.95"
),
(
"2",
"945871268.15"
)
)
}
}
Si la instrucción tarda más, la API continúa de forma asíncrona. En este caso, la respuesta contiene un ID de declaración y un estado.
{
"statement_id": "01ed9a50-c9c9-178e-9be7-0ab52bc998b0",
"standing": {
"state": "PENDING"
}
}
Puede usar el ID de la declaración para verificar el estado de ejecución y, si está listo, recuperar los resultados enviando un GET
solicitud a la /api/2.0/sql/statements/{statement_id}
punto remaining:
GET /api/2.0/sql/statements/<statement_id> HTTP/1.1
Host: <your_HOST>
Authorization: Bearer <your_access_token>
También puede usar el ID de extracto para cancelar la solicitud enviando un POST
solicitud a la /api/2.0/sql/statements/cancel
punto remaining
POST /api/2.0/sql/statements/<statement_id>/cancel HTTP/1.1
Host: <your_HOST>
Authorization: Bearer <your_access_token>
La API se puede configurar para que se comporte de forma síncrona o asíncrona configurando aún más sus solicitudes. Para obtener más información, consulta el tutorial (AWS | Azur) y la documentación (AWS | Azur).
Uso de la API de ejecución de instrucciones SQL de Databricks en JavaScript
Puede enviar solicitudes de API de ejecución de sentencias SQL de Databricks desde cualquier lenguaje de programación. Puede utilizar métodos como el Obtener API en JavaScript; Solicitudes de Python en Python; el pink/http paquete en Go, y así sucesivamente.
Mostramos cómo puede usar la API de ejecución de declaraciones para completar una hoja de cálculo de Google usando JavaScript Obtener API a partir de una Aplicación de hoja de cálculo.
Aplicación de hoja de cálculo de ejemplo
Imaginemos que queremos crear una aplicación de hoja de cálculo de Google que llene una hoja de cálculo con datos sobre pedidos. Nuestros usuarios pueden obtener datos de ingresos de pedidos mensuales en función de criterios predefinidos, como los ingresos de pedidos mensuales para el mes en curso, el año en curso o entre una fecha de inicio y una de finalización. Para cada criterio, podemos escribir las declaraciones SQL correspondientes, enviarlas para su ejecución, obtener y manejar los resultados utilizando la API de ejecución de declaraciones.
En la siguiente sección, describimos los principales componentes básicos para implementar este ejemplo. Para seguir, puede descargar la hoja de cálculo de GitHub.
Creación de la aplicación de hoja de cálculo
Dada una sentencia que queremos ejecutar utilizando la SQL Sentencia API, el executeStatement
La función a continuación captura la lógica basic para manejar el modo predeterminado de la API. En este modo, las ejecuciones de declaraciones comienzan de forma sincrónica y continúan de forma asincrónica después de un tiempo de espera predeterminado de 10 segundos.
Comenzamos enviando una declaración para su ejecución usando el submitStatement
función. Si la declaración se completa dentro del tiempo de espera definido, obtenemos los resultados llamando al handleResult
función. De lo contrario, la ejecución procede de forma asincrónica, lo que significa que debemos sondear el estado de ejecución hasta que finalice: el checkStatus
La función cubre la lógica requerida. Una vez terminado, recuperamos los resultados usando el mismo handleResult
función.
perform executeStatement(assertion) {
var response = submitStatement(assertion);
if (response.standing.state == "SUCCEEDED") {
return handleResult(response.manifest, response.outcome);
} else {
response = checkStatus(response.statement_id)
whereas (response.standing.state == "PENDING" || response.standing.state == "RUNNING"
) {
response = checkStatus(response.statement_id)
}
return handleResult(response.manifest, response.outcome);
}
}
El submitStatement
La función outline el cuerpo de la solicitud donde establecemos los parámetros de ejecución, como el tiempo de espera de 10 segundos (predeterminado), el modo de ejecución y la instrucción SQL. Invoca además un genérico fetchFromUrl
función para enviar una solicitud HTTP. También definimos un HTTP_REQUEST_BASE
constante para pasar el token de acceso para el usuario del área de trabajo de Databricks. Reutilizaremos esta constante para todas las solicitudes HTTP que realizaremos.
const HTTP_REQUEST_BASE = {
headers: {
Authorization: `Bearer ${AUTH_TOKEN}`,
},
contentType: "utility/json",
methodology: "GET",
payload: null,
muteHttpExceptions: true,
};
perform submitStatement(assertion) {
let physique = {
"assertion": assertion,
"warehouse_id": WAREHOUSE,
"wait_timeout": "10s",
"on_wait_timeout": "CONTINUE",
};
let request = Object.assign({}, HTTP_REQUEST_BASE, { methodology: "POST", payload: JSON.stringify(physique) });
let response = fetchFromUrl(`https://${HOST}/api/2.0/sql/statements`, request);
if (response.standing.state == "FAILED") {
showError(`Submit request failed with sudden state: ${response.standing.state}`)
return null;
}
return response;
}
El fetchFromUrl
La función es una función genérica para enviar solicitudes HTTP con un manejo mínimo de errores, como se muestra a continuación.
perform fetchFromUrl(url, request) {
attempt {
let response = UrlFetchApp.fetch(url, request);
let responseJson = JSON.parse(response);
let statusCode = response.getResponseCode();
swap (statusCode) {
case 200:
return responseJson;
default:
showError(`Error: code=${responseJson("error_code")} message=${responseJson("message")}`);
return null;
}
} catch (error) {
showError(`Error: error=${error}`);
return null;
}
}
En el checkStatus
función, si se excede el tiempo de espera, sondeamos el servidor para recuperar el estado de la ejecución de la declaración y determinar cuándo los resultados están listos para obtener.
perform checkStatus(statement_id) {
let response = fetchFromUrl(`https://${HOST}/api/2.0/sql/statements/${statement_id}`, HTTP_REQUEST_BASE);
if (response.standing.state == "FAILED") {
let error = responseJson("standing")("error")
showError(`Fetch request failed: code=${error("error_code")} message=${error("message")}`);
return null;
}
return response;
}
En el handleResult
función, si la declaración se ha completado con éxito y los resultados están disponibles, una respuesta de búsqueda siempre contendrá el primer fragmento de filas. La función maneja el resultado e intenta obtener los fragmentos posteriores si están disponibles.
perform handleResult(manifest, outcome) {
var columnNames = manifest("schema")("columns").map(col => col("identify"));
var chunks = (outcome.data_array);
whereas (outcome("next_chunk_internal_link")) {
chunk = outcome("next_chunk_internal_link");
outcome = fetchFromUrl(`https://${HOST}${chunk}`, HTTP_REQUEST_BASE);
chunks.push(outcome("data_array"));
}
return ((columnNames)).concat(chunks).flat()
}
Todo lo que queda es conectar la función executeStatement a los controladores de eventos de JavaScript para los diversos widgets de la interfaz de usuario, pasando la instrucción SQL correspondiente a la selección del usuario. El Google Guión de aplicaciones La documentación proporciona instrucciones sobre cómo completar la hoja de cálculo con los datos devueltos.
Introducción a la API de ejecución de instrucciones SQL de Databricks
La API de ejecución de instrucciones SQL de Databricks está disponible con los niveles Premium y Enterprise de Databricks. Si ya tiene una cuenta de Databricks, siga nuestro tutorial (AWS | Azur), la documentación (AWS | Azur), o consulta nuestra repositorio de muestras de código. Si no es cliente de Databricks, regístrese para obtener un prueba free of charge.
La API de ejecución de declaraciones de SQL de Databricks complementa la amplia gama de opciones para conectarse a su almacén de SQL de Databricks. Consulta nuestra publicación de weblog anterior para obtener más información sobre la conectividad nativa con Python, Go, Node.js, la CLI y ODBC/JDBC. ¡Realmente se puede acceder a los datos administrados por Databricks Lakehouse Platform desde cualquier lugar!
Únase a nosotros en el Cumbre de datos + IA 2023 para obtener más información sobre la API de ejecución de instrucciones SQL de Databricks y para obtener actualizaciones sobre lo que viene a continuación.