curl --request POST \
--url https://oleander.dev/api/v2/spark/query \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"namespace": "oleander.query",
"name": "flowers_copy",
"query": "SELECT * FROM oleander.default.flowers",
"output_table": "oleander.default.flowers_query_spark_sql",
"driver_machine_type": "spark.1.b",
"executor_machine_type": "spark.1.b",
"executor_numbers": 1
}
'import requests
url = "https://oleander.dev/api/v2/spark/query"
payload = {
"namespace": "oleander.query",
"name": "flowers_copy",
"query": "SELECT * FROM oleander.default.flowers",
"output_table": "oleander.default.flowers_query_spark_sql",
"driver_machine_type": "spark.1.b",
"executor_machine_type": "spark.1.b",
"executor_numbers": 1
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
namespace: 'oleander.query',
name: 'flowers_copy',
query: 'SELECT * FROM oleander.default.flowers',
output_table: 'oleander.default.flowers_query_spark_sql',
driver_machine_type: 'spark.1.b',
executor_machine_type: 'spark.1.b',
executor_numbers: 1
})
};
fetch('https://oleander.dev/api/v2/spark/query', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://oleander.dev/api/v2/spark/query",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'namespace' => 'oleander.query',
'name' => 'flowers_copy',
'query' => 'SELECT * FROM oleander.default.flowers',
'output_table' => 'oleander.default.flowers_query_spark_sql',
'driver_machine_type' => 'spark.1.b',
'executor_machine_type' => 'spark.1.b',
'executor_numbers' => 1
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://oleander.dev/api/v2/spark/query"
payload := strings.NewReader("{\n \"namespace\": \"oleander.query\",\n \"name\": \"flowers_copy\",\n \"query\": \"SELECT * FROM oleander.default.flowers\",\n \"output_table\": \"oleander.default.flowers_query_spark_sql\",\n \"driver_machine_type\": \"spark.1.b\",\n \"executor_machine_type\": \"spark.1.b\",\n \"executor_numbers\": 1\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://oleander.dev/api/v2/spark/query")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"namespace\": \"oleander.query\",\n \"name\": \"flowers_copy\",\n \"query\": \"SELECT * FROM oleander.default.flowers\",\n \"output_table\": \"oleander.default.flowers_query_spark_sql\",\n \"driver_machine_type\": \"spark.1.b\",\n \"executor_machine_type\": \"spark.1.b\",\n \"executor_numbers\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://oleander.dev/api/v2/spark/query")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"namespace\": \"oleander.query\",\n \"name\": \"flowers_copy\",\n \"query\": \"SELECT * FROM oleander.default.flowers\",\n \"output_table\": \"oleander.default.flowers_query_spark_sql\",\n \"driver_machine_type\": \"spark.1.b\",\n \"executor_machine_type\": \"spark.1.b\",\n \"executor_numbers\": 1\n}"
response = http.request(request)
puts response.read_body{
"run_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"job": {
"namespace": "<string>",
"name": "<string>"
},
"output_table": "<string>",
"status": "RUNNING"
}{
"error": "<string>"
}{
"error": "Unauthorized"
}{
"status": 500
}Spark
Execute a SQL query against the oleander lake using managed Spark. The query runs as a named job in the specified namespace. Results are written to output_table as an Iceberg table. Lineage is captured automatically for every run.
curl --request POST \
--url https://oleander.dev/api/v2/spark/query \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"namespace": "oleander.query",
"name": "flowers_copy",
"query": "SELECT * FROM oleander.default.flowers",
"output_table": "oleander.default.flowers_query_spark_sql",
"driver_machine_type": "spark.1.b",
"executor_machine_type": "spark.1.b",
"executor_numbers": 1
}
'import requests
url = "https://oleander.dev/api/v2/spark/query"
payload = {
"namespace": "oleander.query",
"name": "flowers_copy",
"query": "SELECT * FROM oleander.default.flowers",
"output_table": "oleander.default.flowers_query_spark_sql",
"driver_machine_type": "spark.1.b",
"executor_machine_type": "spark.1.b",
"executor_numbers": 1
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
namespace: 'oleander.query',
name: 'flowers_copy',
query: 'SELECT * FROM oleander.default.flowers',
output_table: 'oleander.default.flowers_query_spark_sql',
driver_machine_type: 'spark.1.b',
executor_machine_type: 'spark.1.b',
executor_numbers: 1
})
};
fetch('https://oleander.dev/api/v2/spark/query', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://oleander.dev/api/v2/spark/query",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'namespace' => 'oleander.query',
'name' => 'flowers_copy',
'query' => 'SELECT * FROM oleander.default.flowers',
'output_table' => 'oleander.default.flowers_query_spark_sql',
'driver_machine_type' => 'spark.1.b',
'executor_machine_type' => 'spark.1.b',
'executor_numbers' => 1
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://oleander.dev/api/v2/spark/query"
payload := strings.NewReader("{\n \"namespace\": \"oleander.query\",\n \"name\": \"flowers_copy\",\n \"query\": \"SELECT * FROM oleander.default.flowers\",\n \"output_table\": \"oleander.default.flowers_query_spark_sql\",\n \"driver_machine_type\": \"spark.1.b\",\n \"executor_machine_type\": \"spark.1.b\",\n \"executor_numbers\": 1\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://oleander.dev/api/v2/spark/query")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"namespace\": \"oleander.query\",\n \"name\": \"flowers_copy\",\n \"query\": \"SELECT * FROM oleander.default.flowers\",\n \"output_table\": \"oleander.default.flowers_query_spark_sql\",\n \"driver_machine_type\": \"spark.1.b\",\n \"executor_machine_type\": \"spark.1.b\",\n \"executor_numbers\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://oleander.dev/api/v2/spark/query")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"namespace\": \"oleander.query\",\n \"name\": \"flowers_copy\",\n \"query\": \"SELECT * FROM oleander.default.flowers\",\n \"output_table\": \"oleander.default.flowers_query_spark_sql\",\n \"driver_machine_type\": \"spark.1.b\",\n \"executor_machine_type\": \"spark.1.b\",\n \"executor_numbers\": 1\n}"
response = http.request(request)
puts response.read_body{
"run_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"job": {
"namespace": "<string>",
"name": "<string>"
},
"output_table": "<string>",
"status": "RUNNING"
}{
"error": "<string>"
}{
"error": "Unauthorized"
}{
"status": 500
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Job namespace used to identify this query in lineage and run history.
"oleander.query"
Job name. Combined with namespace to form the unique job identity.
"flowers_copy"
SQL query to execute. Supports all Spark SQL syntax and can reference any table in your Iceberg catalogs.
"SELECT * FROM oleander.default.flowers"
Destination Iceberg table for query results. Format: catalog.namespace.table. The table is created if it does not exist.
"oleander.default.flowers_query_spark_sql"
Machine type for the Spark driver.
"spark.1.b"
Machine type for each Spark executor.
"spark.1.b"
Number of Spark executors to allocate.
1
Was this page helpful?