Instruktionskörnings-API: Kör SQL på lager
Viktigt!
För att få åtkomst till Databricks REST API:er måste du autentisera.
Den här självstudien visar hur du använder Körnings-API 2.0 för Databricks SQL-instruktion för att köra SQL-instruktioner från Databricks SQL-lager.
Information om hur du visar REFERENS för Körning av API 2.0 för Databricks SQL-instruktion finns i Körning av instruktion.
Innan du börjar
Innan du påbörjar den här självstudien måste du se till att du har:
Antingen Databricks CLI version 0.205 eller senare eller
curl
, enligt följande:Databricks CLI är ett kommandoradsverktyg för att skicka och ta emot Databricks REST API-begäranden och svar. Om du använder Databricks CLI version 0.205 eller senare måste den konfigureras för autentisering med din Azure Databricks-arbetsyta. Se Installera eller uppdatera Databricks CLI och autentisering för Databricks CLI.
Om du till exempel vill autentisera med autentisering med personlig åtkomsttoken för Databricks följer du stegen i Personliga åtkomsttoken för Azure Databricks för arbetsyteanvändare.
Gör sedan följande för att använda Databricks CLI för att skapa en Azure Databricks-konfigurationsprofil för din personliga åtkomsttoken:
Kommentar
Följande procedur använder Databricks CLI Om du redan har en
DEFAULT
konfigurationsprofil skriver den här proceduren över din befintligaDEFAULT
konfigurationsprofil.Om du vill kontrollera om du redan har en
DEFAULT
konfigurationsprofil och visa profilens inställningar om den finns använder du Databricks CLI för att köra kommandotdatabricks auth env --profile DEFAULT
.Om du vill skapa en konfigurationsprofil med ett annat namn än
DEFAULT
ersätter duDEFAULT
delen i--profile DEFAULT
i följandedatabricks configure
kommando med ett annat namn för konfigurationsprofilen.Använd Databricks CLI för att skapa en Azure Databricks-konfigurationsprofil med namnet
DEFAULT
som använder personlig åtkomsttokenautentisering i Azure Databricks. Gör detta genom att köra följande kommando:databricks configure --profile DEFAULT
Ange url:en för Azure Databricks per arbetsyta för fråga Databricks-värden, till exempel
https://adb-1234567890123456.7.azuredatabricks.net
.För frågan Personlig åtkomsttoken anger du personlig åtkomsttoken för Azure Databricks för din arbetsyta.
Observera följande i den här självstudiekursens Databricks CLI-exempel:
- Den här självstudien förutsätter att du har en miljövariabel
DATABRICKS_SQL_WAREHOUSE_ID
på din lokala utvecklingsdator. Den här miljövariabeln representerar ID:t för ditt Databricks SQL-lager. Det här ID:t är strängen med bokstäver och siffror som följer/sql/1.0/warehouses/
i fältet HTTP-sökväg för ditt lager. Information om hur du hämtar ditt lagers HTTP-sökvägsvärde finns i Hämta anslutningsinformation för en Azure Databricks-beräkningsresurs. - Om du använder Windows-kommandogränssnittet i stället för ett kommandogränssnitt för Unix, Linux eller macOS ersätter
\
du med^
och ersätter${...}
med%...%
. - Om du använder Windows-kommandogränssnittet i stället för ett kommandogränssnitt för Unix, Linux eller macOS i JSON-dokumentdeklarationer ersätter du öppningen och stängningen
'
med"
och ersätter inre"
med\"
.
curl är ett kommandoradsverktyg för att skicka och ta emot REST API-begäranden och svar. Se även Installera curl. Eller så kan du anpassa den här självstudiekursens
curl
exempel för användning med liknande verktyg som HTTPie.Observera följande i den här självstudiekursens
curl
exempel:- I stället
--header "Authorization: Bearer ${DATABRICKS_TOKEN}"
för kan du använda en .netrc-fil . Om du använder en.netrc
fil ersätter du--header "Authorization: Bearer ${DATABRICKS_TOKEN}"
med--netrc
. - Om du använder Windows-kommandogränssnittet i stället för ett kommandogränssnitt för Unix, Linux eller macOS ersätter
\
du med^
och ersätter${...}
med%...%
. - Om du använder Windows-kommandogränssnittet i stället för ett kommandogränssnitt för Unix, Linux eller macOS i JSON-dokumentdeklarationer ersätter du öppningen och stängningen
'
med"
och ersätter inre"
med\"
.
För den här självstudiekursens
curl
exempel förutsätter den här självstudien också att du har följande miljövariabler på din lokala utvecklingsdator:-
DATABRICKS_HOST
, som representerar namnet på arbetsytans instans, till exempeladb-1234567890123456.7.azuredatabricks.net
, för din Azure Databricks-arbetsyta. -
DATABRICKS_TOKEN
, som representerar en personlig åtkomsttoken för Azure Databricks för din Azure Databricks-arbetsyteanvändare. -
DATABRICKS_SQL_WAREHOUSE_ID
, som representerar ID:t för ditt Databricks SQL-lager. Det här ID:t är strängen med bokstäver och siffror som följer/sql/1.0/warehouses/
i fältet HTTP-sökväg för ditt lager. Information om hur du hämtar ditt lagers HTTP-sökvägsvärde finns i Hämta anslutningsinformation för en Azure Databricks-beräkningsresurs.
Kommentar
När du autentiserar med automatiserade verktyg, system, skript och appar rekommenderar Databricks att du använder personliga åtkomsttoken som tillhör tjänstens huvudnamn i stället för arbetsyteanvändare. Information om hur du skapar token för tjänstens huvudnamn finns i Hantera token för tjänstens huvudnamn.
Om du vill skapa en personlig åtkomsttoken för Azure Databricks följer du staps i Personliga åtkomsttoken för Azure Databricks för arbetsyteanvändare.
Varning
Databricks avråder starkt från hårdkodning av information i dina skript, eftersom den här känsliga informationen kan exponeras i oformaterad text via versionskontrollsystem. Databricks rekommenderar att du använder metoder som miljövariabler som du anger på utvecklingsdatorn i stället. Om du tar bort sådan hårdkodad information från skripten kan du även göra skripten mer portabla.
- I stället
Den här självstudien förutsätter att du också har jq, en kommandoradsprocessor för att köra frågor mot JSON-svarsnyttolaster, som Databricks SQL-instruktionskörnings-API:et returnerar till dig efter varje anrop som du gör till DATAbricks SQL-instruktionens körnings-API. Se Ladda ned jq.
Du måste ha minst en tabell som du kan köra SQL-instruktioner mot. Den här självstudien
lineitem
baseras på tabellen itpch
schemat (kallas även databas) isamples
katalogen. Om du inte har åtkomst till den här katalogen, schemat eller tabellen från din arbetsyta ersätter du dem i den här självstudien med dina egna.
Steg 1: Kör en SQL-instruktion och spara dataresultatet som JSON
Kör följande kommando, vilket gör följande:
- Använder det angivna SQL-lagret, tillsammans med den angivna token om du använder
curl
, för att fråga efter tre kolumner från de två första radernalineitem
i tabellen itcph
schemat isamples
katalogen. - Sparar svarsnyttolasten i JSON-format i en fil med namnet
sql-execution-response.json
i den aktuella arbetskatalogen. - Skriver ut innehållet i
sql-execution-response.json
filen. - Anger en lokal miljövariabel med namnet
SQL_STATEMENT_ID
. Den här variabeln innehåller ID:t för motsvarande SQL-instruktion. Du kan använda det här SQL-instruktions-ID:t för att få information om den instruktionen senare efter behov, vilket visas i steg 2. Du kan också visa den här SQL-instruktionen och hämta dess instruktions-ID från frågehistorikavsnittet i Databricks SQL-konsolen, eller genom att anropa API:et för frågehistorik. - Anger ytterligare en lokal miljövariabel med namnet
NEXT_CHUNK_EXTERNAL_LINK
som innehåller ett API URL-fragment för att hämta nästa segment av JSON-data. Om svarsdata är för stora tillhandahåller Databricks SQL-instruktionskörnings-API:et svaret i segment. Du kan använda det här API-URL-fragmentet för att hämta nästa datasegment, vilket visas i steg 2. Om det inte finns något nästa segment är den här miljövariabeln inställd pånull
. - Skriver ut värdena för
SQL_STATEMENT_ID
miljövariablerna ochNEXT_CHUNK_INTERNAL_LINK
.
Databricks CLI
databricks api post /api/2.0/sql/statements \
--profile <profile-name> \
--json '{
"warehouse_id": "'"$DATABRICKS_SQL_WAREHOUSE_ID"'",
"catalog": "samples",
"schema": "tpch",
"statement": "SELECT l_orderkey, l_extendedprice, l_shipdate FROM lineitem WHERE l_extendedprice > :extended_price AND l_shipdate > :ship_date LIMIT :row_limit",
"parameters": [
{ "name": "extended_price", "value": "60000", "type": "DECIMAL(18,2)" },
{ "name": "ship_date", "value": "1995-01-01", "type": "DATE" },
{ "name": "row_limit", "value": "2", "type": "INT" }
]
}' \
> 'sql-execution-response.json' \
&& jq . 'sql-execution-response.json' \
&& export SQL_STATEMENT_ID=$(jq -r .statement_id 'sql-execution-response.json') \
&& export NEXT_CHUNK_INTERNAL_LINK=$(jq -r .result.next_chunk_internal_link 'sql-execution-response.json') \
&& echo SQL_STATEMENT_ID=$SQL_STATEMENT_ID \
&& echo NEXT_CHUNK_INTERNAL_LINK=$NEXT_CHUNK_INTERNAL_LINK
Ersätt <profile-name>
med namnet på din Azure Databricks-konfigurationsprofil för autentisering.
hårlock
curl --request POST \
https://${DATABRICKS_HOST}/api/2.0/sql/statements/ \
--header "Authorization: Bearer ${DATABRICKS_TOKEN}" \
--header "Content-Type: application/json" \
--data '{
"warehouse_id": "'"$DATABRICKS_SQL_WAREHOUSE_ID"'",
"catalog": "samples",
"schema": "tpch",
"statement": "SELECT l_orderkey, l_extendedprice, l_shipdate FROM lineitem WHERE l_extendedprice > :extended_price AND l_shipdate > :ship_date LIMIT :row_limit",
"parameters": [
{ "name": "extended_price", "value": "60000", "type": "DECIMAL(18,2)" },
{ "name": "ship_date", "value": "1995-01-01", "type": "DATE" },
{ "name": "row_limit", "value": "2", "type": "INT" }
]
}' \
--output 'sql-execution-response.json' \
&& jq . 'sql-execution-response.json' \
&& export SQL_STATEMENT_ID=$(jq -r .statement_id 'sql-execution-response.json') \
&& export NEXT_CHUNK_INTERNAL_LINK=$(jq -r .result.next_chunk_internal_link 'sql-execution-response.json') \
&& echo SQL_STATEMENT_ID=$SQL_STATEMENT_ID \
&& echo NEXT_CHUNK_INTERNAL_LINK=$NEXT_CHUNK_INTERNAL_LINK
I föregående begäran:
Parametriserade frågor består av varje frågeparameters namn föregås av ett kolon (till exempel
:extended_price
) med matchningname
ochvalue
objekt i matrisenparameters
. Du kan också ange ett valfritttype
värde med standardvärdetSTRING
om det inte har angetts.Varning
Databricks rekommenderar starkt att du använder parametrar som bästa praxis för dina SQL-instruktioner.
Om du använder KÖRNINGs-API:et för Databricks SQL-instruktion med ett program som genererar SQL dynamiskt kan detta resultera i SQL-inmatningsattacker. Om du till exempel genererar SQL-kod baserat på en användares val i ett användargränssnitt och inte vidtar lämpliga åtgärder, kan en angripare mata in skadlig SQL-kod för att ändra logiken i din första fråga och därmed läsa, ändra eller ta bort känsliga data.
Parametriserade frågor hjälper till att skydda mot SQL-inmatningsattacker genom att hantera indataargument separat från resten av SQL-koden och tolka dessa argument som literalvärden. Parametrar hjälper också till med återanvändning av kod.
Som standard är alla returnerade data i JSON-matrisformat och standardplatsen för någon av SQL-instruktionens dataresultat ligger inom svarsnyttolasten. Om du vill göra det här beteendet explicit lägger du till
"format":"JSON_ARRAY","disposition":"INLINE"
i nyttolasten för begäran. Om du försöker returnera dataresultat som är större än 25 MiB i svarsnyttolasten returneras en felstatus och SQL-instruktionen avbryts. För dataresultat som är större än 25 MiB kan du använda externa länkar i stället för att försöka returnera dem i svarsnyttolasten, vilket visas i steg 3.Kommandot lagrar svarsnyttolastens innehåll i en lokal fil. Lokal datalagring stöds inte direkt av Databricks SQL-instruktionskörnings-API:et.
Om SQL-instruktionen ännu inte har körts via informationslagret efter 10 sekunder returnerar Databricks SQL-instruktionskörnings-API:et endast SQL-instruktions-ID:t och dess aktuella status i stället för -instruktionens resultat. Om du vill ändra det här beteendet lägger du
"wait_timeout"
till i begäran och ställer in den på"<x>s"
, där<x>
kan vara mellan5
och50
sekunder inklusive, till exempel"50s"
. Om du vill returnera SQL-instruktions-ID:t och dess aktuella status omedelbart anger duwait_timeout
till0s
.Som standard fortsätter SQL-instruktionen att köras om tidsgränsen nås. Om du vill avbryta en SQL-instruktion om tidsgränsen nås i stället lägger du till
"on_wait_timeout":"CANCEL"
i nyttolasten för begäran.Om du vill begränsa antalet returnerade byte lägger du till
"byte_limit"
i begäran och anger det till antalet byte, till exempel1000
.Om du vill begränsa antalet rader som returneras i stället för att lägga till en
LIMIT
sats istatement
kan du lägga"row_limit"
till i begäran och ange den till antalet rader, till exempel"statement":"SELECT * FROM lineitem","row_limit":2
.Om resultatet är större än angivet
byte_limit
ellerrow_limit
angestruncated
fältet tilltrue
i svarsnyttolasten.
Om -instruktionens resultat är tillgängligt innan tidsgränsen för väntetiden slutar är svaret följande:
{
"manifest": {
"chunks": [
{
"chunk_index": 0,
"row_count": 2,
"row_offset": 0
}
],
"format": "JSON_ARRAY",
"schema": {
"column_count": 3,
"columns": [
{
"name": "l_orderkey",
"position": 0,
"type_name": "LONG",
"type_text": "BIGINT"
},
{
"name": "l_extendedprice",
"position": 1,
"type_name": "DECIMAL",
"type_precision": 18,
"type_scale": 2,
"type_text": "DECIMAL(18,2)"
},
{
"name": "l_shipdate",
"position": 2,
"type_name": "DATE",
"type_text": "DATE"
}
]
},
"total_chunk_count": 1,
"total_row_count": 2,
"truncated": false
},
"result": {
"chunk_index": 0,
"data_array": [
[
"2",
"71433.16",
"1997-01-28"
],
[
"7",
"86152.02",
"1996-01-15"
]
],
"row_count": 2,
"row_offset": 0
},
"statement_id": "00000000-0000-0000-0000-000000000000",
"status": {
"state": "SUCCEEDED"
}
}
Om tidsgränsen för väntetiden slutar innan instruktionens resultat är tillgängligt ser svaret ut så här i stället:
{
"statement_id": "00000000-0000-0000-0000-000000000000",
"status": {
"state": "PENDING"
}
}
Om -instruktionens resultatdata är för stora (till exempel i det här fallet genom att köra SELECT l_orderkey, l_extendedprice, l_shipdate FROM lineitem LIMIT 300000
), segmenteras resultatdata och ser ut så här i stället. Observera att "...": "..."
anger utelämnade resultat här för korthet:
{
"manifest": {
"chunks": [
{
"chunk_index": 0,
"row_count": 188416,
"row_offset": 0
},
{
"chunk_index": 1,
"row_count": 111584,
"row_offset": 188416
}
],
"format":"JSON_ARRAY",
"schema": {
"column_count":3,
"columns": [
{
"...": "..."
}
]
},
"total_chunk_count": 2,
"total_row_count": 300000,
"truncated": false
},
"result": {
"chunk_index": 0,
"data_array": [
[
"2",
"71433.16",
"1997-01-28"
],
[
"..."
]
],
"next_chunk_index": 1,
"next_chunk_internal_link": "/api/2.0/sql/statements/00000000-0000-0000-0000-000000000000/result/chunks/1?row_offset=188416",
"row_count": 188416,
"row_offset": 0
},
"statement_id": "00000000-0000-0000-0000-000000000000",
"status": {
"state": "SUCCEEDED"
}
}
Steg 2: Hämta en instruktions aktuella körningsstatus och dataresultat som JSON
Du kan använda sql-instruktionens ID för att hämta instruktionens aktuella körningsstatus och, om körningen lyckades, instruktionens resultat. Om du glömmer instruktionens ID kan du hämta det från frågehistorikavsnittet i Databricks SQL-konsolen eller genom att anropa API:et för frågehistorik. Du kan till exempel fortsätta att avsöka det här kommandot och kontrollera varje gång för att se om körningen har lyckats.
Om du vill hämta en SQL-instruktions aktuella körningsstatus och, om körningen lyckades, den instruktionens resultat och ett API-URL-fragment för att hämta nästa segment av JSON-data kör du följande kommando. Det här kommandot förutsätter att du har en miljövariabel på din lokala utvecklingsdator med namnet SQL_STATEMENT_ID
, som är inställd på värdet för ID:t för SQL-instruktionen från föregående steg. Du kan naturligtvis ersätta ${SQL_STATEMENT_ID}
följande kommando med det hårdkodade ID:t för SQL-instruktionen.
Databricks CLI
databricks api get /api/2.0/sql/statements/${SQL_STATEMENT_ID} \
--profile <profile-name> \
> 'sql-execution-response.json' \
&& jq . 'sql-execution-response.json' \
&& export NEXT_CHUNK_INTERNAL_LINK=$(jq -r .result.next_chunk_internal_link 'sql-execution-response.json') \
&& echo NEXT_CHUNK_INTERNAL_LINK=$NEXT_CHUNK_INTERNAL_LINK
Ersätt <profile-name>
med namnet på din Azure Databricks-konfigurationsprofil för autentisering.
hårlock
curl --request GET \
https://${DATABRICKS_HOST}/api/2.0/sql/statements/${SQL_STATEMENT_ID} \
--header "Authorization: Bearer ${DATABRICKS_TOKEN}" \
--output 'sql-execution-response.json' \
&& jq . 'sql-execution-response.json' \
&& export NEXT_CHUNK_INTERNAL_LINK=$(jq -r .result.next_chunk_internal_link 'sql-execution-response.json') \
&& echo NEXT_CHUNK_INTERNAL_LINK=$NEXT_CHUNK_INTERNAL_LINK
NEXT_CHUNK_INTERNAL_LINK
Om värdet är inställt på ett icke-värdenull
kan du använda det för att hämta nästa datasegment, och så vidare, till exempel med följande kommando:
Databricks CLI
databricks api get /${NEXT_CHUNK_INTERNAL_LINK} \
--profile <profile-name> \
> 'sql-execution-response.json' \
&& jq . 'sql-execution-response.json' \
&& export NEXT_CHUNK_INTERNAL_LINK=$(jq -r .next_chunk_internal_link 'sql-execution-response.json') \
&& echo NEXT_CHUNK_INTERNAL_LINK=$NEXT_CHUNK_INTERNAL_LINK
Ersätt <profile-name>
med namnet på din Azure Databricks-konfigurationsprofil för autentisering.
hårlock
curl --request GET \
https://${DATABRICKS_HOST}${NEXT_CHUNK_INTERNAL_LINK} \
--header "Authorization: Bearer ${DATABRICKS_TOKEN}" \
--output 'sql-execution-response.json' \
&& jq . 'sql-execution-response.json' \
&& export NEXT_CHUNK_INTERNAL_LINK=$(jq -r .next_chunk_internal_link 'sql-execution-response.json') \
&& echo NEXT_CHUNK_INTERNAL_LINK=$NEXT_CHUNK_INTERNAL_LINK
Du kan fortsätta att köra föregående kommando, om och om igen, för att hämta nästa segment och så vidare. Observera att sql-instruktionen stängs så snart det sista segmentet hämtas. Efter den här stängningen kan du inte använda instruktionens ID för att hämta dess aktuella status eller för att hämta fler segment.
Steg 3: Hämta stora resultat med hjälp av externa länkar
Det här avsnittet visar en valfri konfiguration som använder borttagningen EXTERNAL_LINKS
för att hämta stora datamängder. Standardplatsen (borttagning) för SQL-instruktionens resultatdata ligger inom svarsnyttolasten, men dessa resultat är begränsade till 25 MiB. Genom att ange disposition
till EXTERNAL_LINKS
innehåller svaret URL:er som du kan använda för att hämta segmenten i resultatdata med standard-HTTP. URL:erna pekar på arbetsytans interna DBFS, där resultatsegmenten lagras tillfälligt.
Varning
Databricks rekommenderar starkt att du skyddar url:er och token som returneras av borttagningen EXTERNAL_LINKS
.
När du använder borttagningen EXTERNAL_LINKS
genereras en SAS-URL (signatur för delad åtkomst) som kan användas för att ladda ned resultatet direkt från Azure Storage. Eftersom en kortlivad SAS-token är inbäddad i den här SAS-URL:en bör du skydda både SAS-URL:en och SAS-token.
Eftersom SAS-URL:er redan har genererats med inbäddade tillfälliga SAS-token får du inte ange ett Authorization
huvud i nedladdningsbegäranden.
Borttagningen EXTERNAL_LINKS
kan inaktiveras på begäran genom att skapa ett supportärende.
Se även Metodtips för säkerhet.
Kommentar
Det går inte att ändra utdataformatet och beteendet för svarsnyttolasten när de har angetts för ett visst SQL-instruktions-ID.
I det här läget gör API:et att du kan lagra resultatdata i JSON-format (JSON
), CSV-format (CSV
) eller Apache Arrow-format (ARROW_STREAM
), som måste frågas separat med HTTP. När du använder det här läget går det inte heller att infoga resultatdata i svarsnyttolasten.
Följande kommando visar hur du använder EXTERNAL_LINKS
och Apache Arrow-format. Använd det här mönstret i stället för den liknande fråga som visas i steg 1:
Databricks CLI
databricks api post /api/2.0/sql/statements/ \
--profile <profile-name> \
--json '{
"warehouse_id": "'"$DATABRICKS_SQL_WAREHOUSE_ID"'",
"catalog": "samples",
"schema": "tpch",
"format": "ARROW_STREAM",
"disposition": "EXTERNAL_LINKS",
"statement": "SELECT l_orderkey, l_extendedprice, l_shipdate FROM lineitem WHERE l_extendedprice > :extended_price AND l_shipdate > :ship_date LIMIT :row_limit",
"parameters": [
{ "name": "extended_price", "value": "60000", "type": "DECIMAL(18,2)" },
{ "name": "ship_date", "value": "1995-01-01", "type": "DATE" },
{ "name": "row_limit", "value": "100000", "type": "INT" }
]
}' \
> 'sql-execution-response.json' \
&& jq . 'sql-execution-response.json' \
&& export SQL_STATEMENT_ID=$(jq -r .statement_id 'sql-execution-response.json') \
&& echo SQL_STATEMENT_ID=$SQL_STATEMENT_ID
Ersätt <profile-name>
med namnet på din Azure Databricks-konfigurationsprofil för autentisering.
hårlock
curl --request POST \
https://${DATABRICKS_HOST}/api/2.0/sql/statements/ \
--header "Authorization: Bearer ${DATABRICKS_TOKEN}" \
--header "Content-Type: application/json" \
--data '{
"warehouse_id": "'"$DATABRICKS_SQL_WAREHOUSE_ID"'",
"catalog": "samples",
"schema": "tpch",
"format": "ARROW_STREAM",
"disposition": "EXTERNAL_LINKS",
"statement": "SELECT l_orderkey, l_extendedprice, l_shipdate FROM lineitem WHERE l_extendedprice > :extended_price AND l_shipdate > :ship_date LIMIT :row_limit",
"parameters": [
{ "name": "extended_price", "value": "60000", "type": "DECIMAL(18,2)" },
{ "name": "ship_date", "value": "1995-01-01", "type": "DATE" },
{ "name": "row_limit", "value": "100000", "type": "INT" }
]
}' \
--output 'sql-execution-response.json' \
&& jq . 'sql-execution-response.json' \
&& export SQL_STATEMENT_ID=$(jq -r .statement_id 'sql-execution-response.json') \
&& echo SQL_STATEMENT_ID=$SQL_STATEMENT_ID
Svaret är följande:
{
"manifest": {
"chunks": [
{
"byte_count": 2843848,
"chunk_index": 0,
"row_count": 100000,
"row_offset": 0
}
],
"format": "ARROW_STREAM",
"schema": {
"column_count": 3,
"columns": [
{
"name": "l_orderkey",
"position": 0,
"type_name": "LONG",
"type_text": "BIGINT"
},
{
"name": "l_extendedprice",
"position": 1,
"type_name": "DECIMAL",
"type_precision": 18,
"type_scale": 2,
"type_text": "DECIMAL(18,2)"
},
{
"name": "l_shipdate",
"position": 2,
"type_name": "DATE",
"type_text": "DATE"
}
]
},
"total_byte_count": 2843848,
"total_chunk_count": 1,
"total_row_count": 100000,
"truncated": false
},
"result": {
"external_links": [
{
"byte_count": 2843848,
"chunk_index": 0,
"expiration": "<url-expiration-timestamp>",
"external_link": "<url-to-data-stored-externally>",
"row_count": 100000,
"row_offset": 0
}
]
},
"statement_id": "00000000-0000-0000-0000-000000000000",
"status": {
"state": "SUCCEEDED"
}
}
Om begäran överskrider tidsgränsen ser svaret ut så här i stället:
{
"statement_id": "00000000-0000-0000-0000-000000000000",
"status": {
"state": "PENDING"
}
}
Om du vill hämta instruktionens aktuella körningsstatus och, om körningen lyckades, instruktionens resultat kör du följande kommando:
Databricks CLI
databricks api get /api/2.0/sql/statements/${SQL_STATEMENT_ID} \
--profile <profile-name> \
> 'sql-execution-response.json' \
&& jq . 'sql-execution-response.json'
Ersätt <profile-name>
med namnet på din Azure Databricks-konfigurationsprofil för autentisering.
hårlock
curl --request GET \
https://${DATABRICKS_HOST}/api/2.0/sql/statements/${SQL_STATEMENT_ID} \
--header "Authorization: Bearer ${DATABRICKS_TOKEN}" \
--output 'sql-execution-response.json' \
&& jq . 'sql-execution-response.json'
Om svaret är tillräckligt stort (till exempel i det här fallet genom att köras SELECT l_orderkey, l_extendedprice, l_shipdate FROM lineitem
utan radgräns) har svaret flera segment, som i följande exempel nedan. Observera att "...": "..."
anger utelämnade resultat här för korthet:
{
"manifest": {
"chunks": [
{
"byte_count": 11469280,
"chunk_index": 0,
"row_count": 403354,
"row_offset": 0
},
{
"byte_count": 6282464,
"chunk_index": 1,
"row_count": 220939,
"row_offset": 403354
},
{
"...": "..."
},
{
"byte_count": 6322880,
"chunk_index": 10,
"row_count": 222355,
"row_offset": 3113156
}
],
"format":"ARROW_STREAM",
"schema": {
"column_count": 3,
"columns": [
{
"...": "..."
}
]
},
"total_byte_count": 94845304,
"total_chunk_count": 11,
"total_row_count": 3335511,
"truncated": false
},
"result": {
"external_links": [
{
"byte_count": 11469280,
"chunk_index": 0,
"expiration": "<url-expiration-timestamp>",
"external_link": "<url-to-data-stored-externally>",
"next_chunk_index": 1,
"next_chunk_internal_link": "/api/2.0/sql/statements/00000000-0000-0000-0000-000000000000/result/chunks/1?row_offset=403354",
"row_count": 403354,
"row_offset": 0
}
]
},
"statement_id": "00000000-0000-0000-0000-000000000000",
"status": {
"state": "SUCCEEDED"
}
}
Om du vill ladda ned det lagrade innehållets resultat kan du köra följande curl
kommando med hjälp av URL:en i external_link
objektet och ange var du vill ladda ned filen. Inkludera inte din Azure Databricks-token i det här kommandot:
curl "<url-to-result-stored-externally>" \
--output "<path/to/download/the/file/locally>"
Om du vill ladda ned ett visst segment av ett strömmat innehålls resultat kan du använda något av följande:
- Värdet
next_chunk_index
från svarsnyttolasten för nästa segment (om det finns ett nästa segment). - Ett av segmentindexen från svarsnyttolastens manifest för alla tillgängliga segment om det finns flera segment.
Om du till exempel vill hämta segmentet med ett chunk_index
av 10
från föregående svar kör du följande kommando:
Databricks CLI
databricks api get /api/2.0/sql/statements/${SQL_STATEMENT_ID}/result/chunks/10 \
--profile <profile-name> \
> 'sql-execution-response.json' \
&& jq . 'sql-execution-response.json'
Ersätt <profile-name>
med namnet på din Azure Databricks-konfigurationsprofil för autentisering.
hårlock
curl --request GET \
https://${DATABRICKS_HOST}/api/2.0/sql/statements/${SQL_STATEMENT_ID}/result/chunks/10 \
--header "Authorization: Bearer ${DATABRICKS_TOKEN}" \
--output 'sql-execution-response.json' \
&& jq . 'sql-execution-response.json'
Kommentar
Om du kör föregående kommando returneras en ny SAS-URL.
Om du vill ladda ned det lagrade segmentet använder du URL:en i external_link
objektet.
Mer information om Apache Arrow-formatet finns i:
Steg 4: Avbryt körningen av en SQL-instruktion
Om du behöver avbryta en SQL-instruktion som ännu inte har slutförts kör du följande kommando:
Databricks CLI
databricks api post /api/2.0/sql/statements/${SQL_STATEMENT_ID}/cancel \
--profile <profile-name> \
--json '{}'
Ersätt <profile-name>
med namnet på din Azure Databricks-konfigurationsprofil för autentisering.
hårlock
curl --request POST \
https://${DATABRICKS_HOST}/api/2.0/sql/statements/${SQL_STATEMENT_ID}/cancel \
--header "Authorization: Bearer ${DATABRICKS_TOKEN}"
Metodtips för säkerhet
Körnings-API:et för Databricks SQL-instruktion ökar säkerheten för dataöverföringar med hjälp av TLS-kryptering (End-to-End Transport Layer Security) och kortlivade autentiseringsuppgifter, till exempel SAS-token.
Det finns flera lager i den här säkerhetsmodellen. På transportlagret är det bara möjligt att anropa DATAbricks SQL-instruktionens körnings-API med hjälp av TLS 1.2 eller senare. Anropare av Databricks SQL Statement Execution API måste också autentiseras med en giltig personlig åtkomsttoken för Azure Databricks, OAuth-åtkomsttoken eller Microsoft Entra-ID-token (tidigare Azure Active Directory) som mappar till en användare som har behörighet att använda Databricks SQL. Den här användaren måste ha CAN USE-åtkomst för det specifika SQL-lager som används och åtkomsten kan begränsas med IP-åtkomstlistor. Detta gäller för alla begäranden till KÖRNINGs-API:et för Databricks SQL-instruktion. För att köra instruktioner måste den autentiserade användaren dessutom ha behörighet till de dataobjekt (till exempel tabeller, vyer och funktioner) som används i varje instruktion. Detta framtvingas av befintliga mekanismer för åtkomstkontroll i Unity Catalog eller med hjälp av tabell-ACL:er. (Se Datastyrning med Unity Catalog för mer information.) Det innebär också att endast den användare som kör en instruktion kan hämta begäranden för -instruktionens resultat.
Databricks rekommenderar följande rekommenderade säkerhetsmetoder när du använder KÖRNINGs-API:et för Databricks SQL-instruktion tillsammans med borttagningen EXTERNAL_LINKS
för att hämta stora datamängder:
- Ta bort Databricks-auktoriseringshuvudet för Azure Storage-begäranden
- Skydda SAS-URL:er och SAS-token
Borttagningen EXTERNAL_LINKS
kan inaktiveras på begäran genom att skapa ett supportärende. Kontakta ditt Azure Databricks-kontoteam om du vill göra den här begäran.
Ta bort Databricks-auktoriseringshuvudet för Azure Storage-begäranden
Alla anrop till Körnings-API:et för Databricks SQL-instruktion som använder curl
måste innehålla ett Authorization
huvud som innehåller autentiseringsuppgifter för Azure Databricks-åtkomst. Inkludera inte den här Authorization
rubriken när du laddar ned data från Azure Storage. Det här huvudet krävs inte och kan oavsiktligt exponera dina autentiseringsuppgifter för Azure Databricks-åtkomst.
Skydda SAS-URL:er och SAS-token
När du använder borttagningen EXTERNAL_LINKS
genereras en kortlivad SAS-URL som anroparen kan använda för att ladda ned resultaten direkt från Azure Storage med hjälp av TLS. Eftersom en kortlivad SAS-token är inbäddad i den här SAS-URL:en bör du skydda både SAS-URL:en och SAS-token.