Utasítás-végrehajtási API: SQL futtatása a raktárakban
Fontos
A Databricks REST API-k eléréséhez hitelesítenie kell.
Ez az oktatóanyag bemutatja, hogyan futtathat SQL-utasításokat a Databricks SQL Warehouse-ból a Databricks SQL Statement Execution API 2.0 használatával.
A Databricks SQL Statement Execution API 2.0-ra vonatkozó hivatkozásának megtekintéséhez tekintse meg az Utasítás végrehajtása című témakört.
Mielőtt elkezdené
Mielőtt elkezdené ezt az oktatóanyagot, győződjön meg arról, hogy rendelkezik az alábbiakval:
A Databricks CLI 0.205-ös vagy újabb verziója, vagy
curl
az alábbiak szerint:A Databricks CLI egy parancssori eszköz a Databricks REST API-kérések és -válaszok küldéséhez és fogadásához. Ha a Databricks CLI 0.205-ös vagy újabb verzióját használja, azt konfigurálni kell az Azure Databricks-munkaterület hitelesítéséhez. Lásd: A Databricks parancssori felület databricks parancssori felületének és hitelesítésének telepítése vagy frissítése.
Ha például a Databricks személyes hozzáférési jogkivonat-hitelesítésével szeretne hitelesíteni, hozzon létre egy személyes hozzáférési jogkivonatot az alábbiak szerint:
- Az Azure Databricks-munkaterületen kattintson az Azure Databricks-felhasználónevére a felső sávon, majd válassza a legördülő menü Beállítások elemét .
- Kattintson a Fejlesztőeszközök elemre.
- Az Access-jogkivonatok mellett kattintson a Kezelés gombra.
- Kattintson az Új jogkivonat létrehozása elemre.
- (Nem kötelező) Írjon be egy megjegyzést, amely segít azonosítani a jogkivonatot a jövőben, és módosíthatja a jogkivonat alapértelmezett 90 napos élettartamát. Élettartam nélküli (nem ajánlott) jogkivonat létrehozásához hagyja üresen az Élettartam (nap) mezőt (üres).
- Kattintson a Létrehozás lehetőségre.
- Másolja a megjelenített jogkivonatot egy biztonságos helyre, majd kattintson a Kész gombra.
Feljegyzés
Ügyeljen arra, hogy a másolt jogkivonatot biztonságos helyre mentse. Ne ossza meg másokkal a másolt jogkivonatot. Ha elveszíti a másolt jogkivonatot, nem tudja pontosan ugyanazt a jogkivonatot újragenerálni. Ehelyett meg kell ismételnie ezt az eljárást egy új jogkivonat létrehozásához. Ha elveszíti a másolt jogkivonatot, vagy úgy véli, hogy a jogkivonat sérült, a Databricks határozottan javasolja, hogy azonnal törölje a jogkivonatot a munkaterületről az Access-jogkivonatok lapon a jogkivonat melletti kuka (Visszavonás) ikonra kattintva.
Ha nem tud jogkivonatokat létrehozni vagy használni a munkaterületen, ennek az lehet az oka, hogy a munkaterület rendszergazdája letiltotta a jogkivonatokat, vagy nem adott engedélyt a jogkivonatok létrehozására vagy használatára. Tekintse meg a munkaterület rendszergazdáját vagy a következő témaköröket:
Ezután a Databricks parancssori felületének használatával hozzon létre egy Azure Databricks-konfigurációs profilt a személyes hozzáférési jogkivonathoz, tegye a következőket:
Feljegyzés
Az alábbi eljárás a Databricks CLI használatával hoz létre egy Azure Databricks-konfigurációs profilt a névvel
DEFAULT
. Ha már rendelkezik konfigurációs profillalDEFAULT
, ez az eljárás felülírja a meglévőDEFAULT
konfigurációs profilt.Annak ellenőrzéséhez, hogy rendelkezik-e
DEFAULT
már konfigurációs profillal, és ha létezik, tekintse meg a profil beállításait, a Databricks parancssori felületével futtassa a parancsotdatabricks auth env --profile DEFAULT
.Ha nem más
DEFAULT
néven szeretne konfigurációs profilt létrehozni, cserélje le aDEFAULT
következődatabricks configure
parancs egy másik--profile DEFAULT
nevére a konfigurációs profilt.A Databricks CLI használatával hozzon létre egy Azure Databricks-konfigurációs profilt
DEFAULT
, amely azure Databricks személyes hozzáférési jogkivonat-hitelesítést használ. Ehhez futtassa az alábbi parancsot:databricks configure --profile DEFAULT
A databricks-gazdagép kéréséhez adja meg például
https://adb-1234567890123456.7.azuredatabricks.net
az Azure Databricks munkaterületenkénti URL-címét.A személyes hozzáférési jogkivonat megadásához adja meg a munkaterület Azure Databricks személyes hozzáférési jogkivonatát.
Az oktatóanyag Databricks CLI-példáiban jegyezze fel a következőket:
- Ez az oktatóanyag feltételezi, hogy rendelkezik egy környezeti változóval
DATABRICKS_SQL_WAREHOUSE_ID
a helyi fejlesztőgépen. Ez a környezeti változó a Databricks SQL Warehouse azonosítóját jelöli. Ez az azonosító a raktár HTTP-elérési útjának mezőjében következő/sql/1.0/warehouses/
betűk és számok sztringje. A raktár HTTP-elérésiút-értékének lekéréséről az Azure Databricks számítási erőforrás kapcsolati adatainak lekérése című témakörben olvashat. - Ha a Windows command shellt használja a Unix, Linux vagy macOS parancshéj helyett, cserélje le
\
a következőre^
, és cserélje le${...}
a következőre%...%
: . - Ha a Windows command shellt használja a Unix, Linux vagy macOS parancshéj helyett, JSON-dokumentumdeklarációkban cserélje le a megnyitást és a befejezést
'
"
, és cserélje le a belsőt"
a következőre\"
: .
A curl egy parancssori eszköz REST API-kérések és válaszok küldéséhez és fogadásához. Lásd még : Install curl. Vagy adaptálhatja az oktatóanyag példáit
curl
hasonló eszközökkel, például a HTTPie-vel való használatra.Az oktatóanyag példáiban
curl
jegyezze fel a következőket:--header "Authorization: Bearer ${DATABRICKS_TOKEN}"
Ehelyett .netrc-fájlt használhat. Ha fájlt használ.netrc
, cserélje le a következőre--header "Authorization: Bearer ${DATABRICKS_TOKEN}"
--netrc
: .- Ha a Windows command shellt használja a Unix, Linux vagy macOS parancshéj helyett, cserélje le
\
a következőre^
, és cserélje le${...}
a következőre%...%
: . - Ha a Windows command shellt használja a Unix, Linux vagy macOS parancshéj helyett, JSON-dokumentumdeklarációkban cserélje le a megnyitást és a befejezést
'
"
, és cserélje le a belsőt"
a következőre\"
: .
Az oktatóanyag példáihoz
curl
az alábbi környezeti változókat feltételezi a helyi fejlesztőgépen:DATABRICKS_HOST
, amely például az Azure Databricks-munkaterület munkaterületének nevétadb-1234567890123456.7.azuredatabricks.net
jelöli.DATABRICKS_TOKEN
, amely egy Azure Databricks személyes hozzáférési jogkivonatot jelöl az Azure Databricks-munkaterület felhasználója számára.DATABRICKS_SQL_WAREHOUSE_ID
, amely a Databricks SQL Warehouse azonosítóját jelöli. Ez az azonosító a raktár HTTP-elérési útjának mezőjében következő/sql/1.0/warehouses/
betűk és számok sztringje. A raktár HTTP-elérésiút-értékének lekéréséről az Azure Databricks számítási erőforrás kapcsolati adatainak lekérése című témakörben olvashat.
Feljegyzés
Ajánlott biztonsági eljárásként, ha automatizált eszközökkel, rendszerekkel, szkriptekkel és alkalmazásokkal hitelesít, a Databricks azt javasolja, hogy munkaterület-felhasználók helyett a szolgáltatásnevekhez tartozó személyes hozzáférési jogkivonatokat használja. A szolgáltatásnevek jogkivonatainak létrehozásáról a szolgáltatásnév jogkivonatainak kezelése című témakörben olvashat.
Azure Databricks személyes hozzáférési jogkivonat létrehozásához tegye a következőket:
- Az Azure Databricks-munkaterületen kattintson az Azure Databricks-felhasználónevére a felső sávon, majd válassza a legördülő menü Beállítások elemét .
- Kattintson a Fejlesztőeszközök elemre.
- Az Access-jogkivonatok mellett kattintson a Kezelés gombra.
- Kattintson az Új jogkivonat létrehozása elemre.
- (Nem kötelező) Írjon be egy megjegyzést, amely segít azonosítani a jogkivonatot a jövőben, és módosíthatja a jogkivonat alapértelmezett 90 napos élettartamát. Élettartam nélküli (nem ajánlott) jogkivonat létrehozásához hagyja üresen az Élettartam (nap) mezőt (üres).
- Kattintson a Létrehozás lehetőségre.
- Másolja a megjelenített jogkivonatot egy biztonságos helyre, majd kattintson a Kész gombra.
Feljegyzés
Ügyeljen arra, hogy a másolt jogkivonatot biztonságos helyre mentse. Ne ossza meg másokkal a másolt jogkivonatot. Ha elveszíti a másolt jogkivonatot, nem tudja pontosan ugyanazt a jogkivonatot újragenerálni. Ehelyett meg kell ismételnie ezt az eljárást egy új jogkivonat létrehozásához. Ha elveszíti a másolt jogkivonatot, vagy úgy véli, hogy a jogkivonat sérült, a Databricks határozottan javasolja, hogy azonnal törölje a jogkivonatot a munkaterületről az Access-jogkivonatok lapon a jogkivonat melletti kuka (Visszavonás) ikonra kattintva.
Ha nem tud jogkivonatokat létrehozni vagy használni a munkaterületen, ennek az lehet az oka, hogy a munkaterület rendszergazdája letiltotta a jogkivonatokat, vagy nem adott engedélyt a jogkivonatok létrehozására vagy használatára. Tekintse meg a munkaterület rendszergazdáját vagy a következő témaköröket:
Figyelmeztetés
A Databricks határozottan visszatartja a szkriptekbe való kemény kódolást, mivel ezek a bizalmas információk egyszerű szövegben, verziókövetési rendszereken keresztül is közzétehetők. A Databricks azt javasolja, hogy olyan megközelítéseket használjon, mint például a fejlesztői gépen beállított környezeti változók. Ha eltávolítja az ilyen szigorúan kódolt adatokat a szkriptekből, az segít, hogy ezek a szkriptek hordozhatóbbak legyenek.
Ez az oktatóanyag feltételezi, hogy a JQ parancssori processzorral is rendelkezik a JSON-válasz hasznos adatainak lekérdezéséhez, amelyet a Databricks SQL Statement Execution API a Databricks SQL-utasítás végrehajtási API-jának minden egyes hívása után visszaad. Lásd: Letöltés jq.
Rendelkeznie kell legalább egy táblával, amellyel SQL-utasításokat hajthat végre. Ez az oktatóanyag a
lineitem
katalógus sématáblájántpch
(más néven adatbázison)samples
alapul. Ha nem fér hozzá ehhez a katalógushoz, sémához vagy táblához a munkaterületről, cserélje le őket az oktatóanyag során a sajátjával.
1. lépés: SQL-utasítás végrehajtása és az adateredmény mentése JSON-ként
Futtassa a következő parancsot, amely a következőket hajtja végre:
- A megadott SQL Warehouse-t és a megadott jogkivonatot használja
curl
a katalógusban lévő sématcph
samples
tábla első két sorábóllineitem
származó három oszlop lekérdezéséhez. - A válasz hasznos adatait JSON formátumban menti az aktuális munkakönyvtárban elnevezett
sql-execution-response.json
fájlba. - Kinyomtatja a fájl tartalmát
sql-execution-response.json
. - Beállít egy helyi környezeti változót .
SQL_STATEMENT_ID
Ez a változó a megfelelő SQL-utasítás azonosítóját tartalmazza. Ezt az SQL-utasításazonosítót használhatja az utasítással kapcsolatos információk igény szerinti lekéréséhez, amelyet a 2. lépés mutat be. Ezt az SQL-utasítást a Databricks SQL-konzol lekérdezéselőzmények szakaszából vagy a Lekérdezéselőzmények API meghívásával is megtekintheti és lekérheti annak utasításazonosítóját. - Beállít egy további helyi környezeti változót,
NEXT_CHUNK_EXTERNAL_LINK
amely egy API URL-töredékét tartalmazza a JSON-adatok következő adattömbjének lekéréséhez. Ha a válaszadatok túl nagyok, a Databricks SQL Statement Execution API adattömbökben adja meg a választ. Ezt az API URL-töredékét használhatja a következő adattömb lekéréséhez, amelyet a 2. lépés mutat be. Ha nincs következő adattömb, akkor ez a környezeti változó a következőrenull
van állítva. - Kinyomtatja a környezeti és
NEXT_CHUNK_INTERNAL_LINK
aSQL_STATEMENT_ID
környezeti változók értékeit.
A Databricks parancssori felülete
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
Cserélje le <profile-name>
az Azure Databricks-konfigurációs profil nevére a hitelesítéshez.
csavarodik
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
Az előző kérelemben:
A paraméteres lekérdezések minden lekérdezési paraméter nevét kettősponttal (például ) előzik meg,
:extended_price
amely egyezőname
ésvalue
egy objektumot tartalmaz aparameters
tömbben. Megadható opcionálistype
is, ha nincs megadva az alapértelmezett értékSTRING
.Figyelmeztetés
A Databricks határozottan javasolja, hogy az SQL-utasításokhoz ajánlott eljárásként használja a paramétereket.
Ha a Databricks SQL Statement Execution API-t olyan alkalmazással használja, amely dinamikusan generálja az SQL-t, ez SQL-injektálási támadásokat eredményezhet. Ha például sql-kódot hoz létre a felhasználói felületen a felhasználó kijelölései alapján, és nem tesz megfelelő intézkedéseket, a támadó rosszindulatú SQL-kódot szúrhat be a kezdeti lekérdezés logikájának módosításához, ezáltal bizalmas adatok olvasásához, módosításához vagy törléséhez.
A paraméteres lekérdezések segítenek megvédeni az SQL-injektálási támadásokat azáltal, hogy a bemeneti argumentumokat a többi SQL-kódtól elkülönítve kezelik, és ezeket az argumentumokat literális értékekként értelmezik. A paraméterek a kód újrafelhasználhatóságában is segítenek.
Alapértelmezés szerint a visszaadott adatok JSON-tömbformátumban vannak, és az SQL-utasítás adateredményeinek alapértelmezett helye a válasz hasznos adatai között van. A viselkedés explicitvá tétele érdekében adja hozzá
"format":"JSON_ARRAY","disposition":"INLINE"
a kérelem hasznos adatait. Ha 25 MiB-nél nagyobb adateredményeket próbál visszaadni a válasz hasznos adataiban, a rendszer hibaállapotot ad vissza, és az SQL-utasítás megszakad. A 25 MiB-nél nagyobb adateredmények esetén külső hivatkozásokat használhat ahelyett, hogy megpróbálná visszaadni a válasz hasznos adataiban, amelyet a 3. lépés mutat be.A parancs a válasz hasznos adatainak tartalmát egy helyi fájlban tárolja. A Databricks SQL Statement Execution API közvetlenül nem támogatja a helyi adattárolást.
Alapértelmezés szerint 10 másodperc elteltével, ha az SQL-utasítás még nem fejezte be a végrehajtást a raktáron keresztül, a Databricks SQL Statement Execution API az utasítás eredménye helyett csak az SQL-utasítás azonosítóját és aktuális állapotát adja vissza. Ennek a viselkedésnek a módosításához adja hozzá
"wait_timeout"
a kérést, és állítsa be a következő értékre"<x>s"
,<x>
például"50s"
a két másodperc50
közötti5
értékre. Az SQL-utasítás azonosítójának és aktuális állapotának azonnali visszaadásához állítsa be a következőtwait_timeout
0s
: .Alapértelmezés szerint az SQL-utasítás továbbra is fut, ha eléri az időtúllépési időszakot. Ha az időtúllépési időszak elérésekor meg szeretné szüntetni az SQL-utasítást, adja hozzá
"on_wait_timeout":"CANCEL"
a kérelem hasznos adatait.A visszaadott bájtok számának korlátozásához adja hozzá
"byte_limit"
a kéréshez, és állítsa be például1000
a bájtok számát.A visszaadott sorok számának korlátozásához záradék
statement
hozzáadásaLIMIT
helyett hozzáadhatja"row_limit"
a kéréshez, és beállíthatja például"statement":"SELECT * FROM lineitem","row_limit":2
a sorok számát.Ha az eredmény nagyobb a megadottnál
byte_limit
, vagyrow_limit
ha atruncated
mező a válasz hasznos adatai között van beállítvatrue
.
Ha az utasítás eredménye a várakozási időtúllépés vége előtt érhető el, a válasz a következő:
{
"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"
}
}
Ha a várakozási időtúllépés az utasítás eredményének megjelenése előtt véget ér, a válasz a következőképpen néz ki:
{
"statement_id": "00000000-0000-0000-0000-000000000000",
"status": {
"state": "PENDING"
}
}
Ha az utasítás eredményadatai túl nagyok (például ebben az esetben futtatáskor SELECT l_orderkey, l_extendedprice, l_shipdate FROM lineitem LIMIT 300000
), az eredményadatok adattömbbe kerülnek, és így néznek ki. Figyelje meg, hogy itt "...": "..."
nem található eredmény a rövidség kedvéért:
{
"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"
}
}
2. lépés: Az utasítás aktuális végrehajtási állapotának és adateredményének lekérése JSON-ként
Az SQL-utasítás azonosítójával lekérheti az utasítás aktuális végrehajtási állapotát, és ha a végrehajtás sikeres volt, az utasítás eredménye. Ha elfelejti az utasítás azonosítóját, lekérheti a Databricks SQL-konzol lekérdezéselőzmények szakaszából vagy a Lekérdezéselőzmények API meghívásával. Például továbbra is lekérdezheti ezt a parancsot, és minden alkalommal ellenőrizheti, hogy a végrehajtás sikeres volt-e.
Az SQL-utasítás aktuális végrehajtási állapotának lekéréséhez és ha a végrehajtás sikeres volt, futtassa az alábbi parancsot az utasítás eredményének és egy API URL-töredékének lekéréséhez. Ez a parancs feltételezi, hogy rendelkezik egy környezeti változóval SQL_STATEMENT_ID
a helyi fejlesztőgépen, amely az előző lépésben megadott SQL-utasítás azonosítójának értékére van beállítva. Az alábbi parancsot természetesen helyettesítheti ${SQL_STATEMENT_ID}
az SQL-utasítás kódolt azonosítójával.
A Databricks parancssori felülete
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
Cserélje le <profile-name>
az Azure Databricks-konfigurációs profil nevére a hitelesítéshez.
csavarodik
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
Ha az NEXT_CHUNK_INTERNAL_LINK
érték nemnull
értékre van állítva, akkor a következő adattömb lekérésére használható, és így tovább, például a következő paranccsal:
A Databricks parancssori felülete
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
Cserélje le <profile-name>
az Azure Databricks-konfigurációs profil nevére a hitelesítéshez.
csavarodik
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
Az előző parancsot újra és újra futtathatja a következő adattömb lekéréséhez, és így tovább. Vegye figyelembe, hogy az utolsó adattömb lekérése után az SQL-utasítás bezárul. A lezárás után nem használhatja az utasítás azonosítóját az aktuális állapot lekéréséhez vagy további adattömbök lekéréséhez.
3. lépés: Nagy eredmények lekérése külső hivatkozások használatával
Ez a szakasz egy választható konfigurációt mutat be, amely a nagy adatkészletek lekérésére használja a EXTERNAL_LINKS
diszpozíciót. Az SQL-utasítás eredményadatainak alapértelmezett helye (eloszlása) a válasz hasznos adatain belül van, de ezek az eredmények legfeljebb 25 MiB-re korlátozódnak. A beállítással a disposition
EXTERNAL_LINKS
válasz URL-címeket tartalmaz, amellyel lekérheti az eredményadatok adattömbjeit a szabványos HTTP-vel. Az URL-címek a munkaterület belső DBFS-ére mutatnak, ahol az eredménytömbök ideiglenesen tárolódnak.
Figyelmeztetés
A Databricks határozottan javasolja a diszpozíció által EXTERNAL_LINKS
visszaadott URL-címek és jogkivonatok védelmét.
A diszpozíció használatakor EXTERNAL_LINKS
létrejön egy közös hozzáférésű jogosultságkód (SAS) URL-cím, amellyel közvetlenül az Azure Storage-ból töltheti le az eredményeket. Mivel egy rövid élettartamú SAS-jogkivonat van beágyazva ebbe az SAS URL-címbe, az SAS URL-címet és az SAS-jogkivonatot is védenie kell.
Mivel az SAS-URL-címek már beágyazott ideiglenes SAS-jogkivonatokkal vannak létrehozva, nem szabad fejlécet Authorization
beállítania a letöltési kérelmekben.
A EXTERNAL_LINKS
letiltás kérelemre letiltható egy támogatási eset létrehozásával.
Lásd még a biztonsági ajánlott eljárásokat.
Feljegyzés
A válasz hasznos adat kimeneti formátuma és viselkedése egy adott SQL-utasításazonosító beállítása után nem módosítható.
Ebben a módban az API lehetővé teszi, hogy az eredményadatokat JSON formátumban (), CSV formátumban (JSON
CSV
) vagy Apache Arrow formátumban (ARROW_STREAM
) tárolja, amelyeket külön kell lekérdezni a HTTP-vel. Ha ezt a módot használja, az eredményadatok nem ágyazhatóak be a válasz hasznos adataiba.
Az alábbi parancs a használatot EXTERNAL_LINKS
és az Apache Arrow formátumot mutatja be. Használja ezt a mintát az 1. lépésben bemutatott hasonló lekérdezés helyett:
A Databricks parancssori felülete
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
Cserélje le <profile-name>
az Azure Databricks-konfigurációs profil nevére a hitelesítéshez.
csavarodik
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
A válasz a következő:
{
"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"
}
}
Ha a kérés túllépi az időkorlátot, a válasz a következőképpen néz ki:
{
"statement_id": "00000000-0000-0000-0000-000000000000",
"status": {
"state": "PENDING"
}
}
Az utasítás aktuális végrehajtási állapotának lekéréséhez és ha a végrehajtás sikeres volt, futtassa az alábbi parancsot:
A Databricks parancssori felülete
databricks api get /api/2.0/sql/statements/${SQL_STATEMENT_ID} \
--profile <profile-name> \
> 'sql-execution-response.json' \
&& jq . 'sql-execution-response.json'
Cserélje le <profile-name>
az Azure Databricks-konfigurációs profil nevére a hitelesítéshez.
csavarodik
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'
Ha a válasz elég nagy (például ebben az esetben sorkorlát nélkül fut SELECT l_orderkey, l_extendedprice, l_shipdate FROM lineitem
), a válasz több adattömbből áll, mint az alábbi példában. Figyelje meg, hogy itt "...": "..."
nem található eredmény a rövidség kedvéért:
{
"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"
}
}
A tárolt tartalom eredményeinek letöltéséhez futtassa az alábbi curl
parancsot az objektum URL-címével external_link
, és adja meg, hogy hol szeretné letölteni a fájlt. Ne foglalja bele az Azure Databricks-jogkivonatot ebbe a parancsba:
curl "<url-to-result-stored-externally>" \
--output "<path/to/download/the/file/locally>"
A streamelt tartalom eredményeinek egy adott adattömbjének letöltéséhez az alábbiak egyikét használhatja:
- A
next_chunk_index
válasz hasznos adatainak értéke a következő adattömbhöz (ha van egy következő adattömb). - Ha több adattömb van, a válasz hasznos adatjegyzékéből származó adattömbindexek egyike a rendelkezésre álló adattömbökhöz.
Ha például le szeretné kapni az adattömbet az előző válaszból chunk_index
10
, futtassa a következő parancsot:
A Databricks parancssori felülete
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'
Cserélje le <profile-name>
az Azure Databricks-konfigurációs profil nevére a hitelesítéshez.
csavarodik
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'
Feljegyzés
Az előző parancs futtatása egy új SAS URL-címet ad vissza.
A tárolt adattömb letöltéséhez használja az objektum URL-címét external_link
.
További információ az Apache Arrow formátumról:
4. lépés: SQL-utasítás végrehajtásának megszakítása
Ha egy még nem sikeres SQL-utasítást kell visszavonnia, futtassa a következő parancsot:
A Databricks parancssori felülete
databricks api post /api/2.0/sql/statements/${SQL_STATEMENT_ID}/cancel \
--profile <profile-name> \
--json '{}'
Cserélje le <profile-name>
az Azure Databricks-konfigurációs profil nevére a hitelesítéshez.
csavarodik
curl --request POST \
https://${DATABRICKS_HOST}/api/2.0/sql/statements/${SQL_STATEMENT_ID}/cancel \
--header "Authorization: Bearer ${DATABRICKS_TOKEN}"
Ajánlott biztonsági eljárások
A Databricks SQL Statement Execution API a végpontok közötti átvitel biztonsági (TLS) titkosításával és a rövid élettartamú hitelesítő adatokkal, például SAS-jogkivonatokkal növeli az adatátvitel biztonságát.
Ebben a biztonsági modellben több réteg is található. Az átviteli rétegben a Databricks SQL Statement Execution API meghívása csak TLS 1.2 vagy újabb használatával lehetséges. Emellett a Databricks SQL Statement Execution API hívóit hitelesíteni kell érvényes Azure Databricks személyes hozzáférési jogkivonattal, OAuth hozzáférési jogkivonattal vagy Microsoft Entra-azonosítóval (korábbi nevén Azure Active Directory) olyan felhasználóhoz, aki jogosult a Databricks SQL használatára. Ennek a felhasználónak rendelkeznie kell a használt SQL-tárolóhoz való HOZZÁFÉRÉSsel, és a hozzáférés ip-hozzáférési listákkal korlátozható. Ez a Databricks SQL Statement Execution API-ra irányuló összes kérésre vonatkozik. Ezenkívül az utasítások végrehajtásához a hitelesített felhasználónak engedéllyel kell rendelkeznie az egyes utasításokban használt adatobjektumokhoz (például táblákhoz, nézetekhez és függvényekhez). Ezt a Unity Katalógus meglévő hozzáférés-vezérlési mechanizmusai vagy a tábla ACL-jei kényszerítik ki. (Lásd: Adatszabályozás a Unity Katalógussal további részletekért.) Ez azt is jelenti, hogy csak az utasítást végrehajtó felhasználó kérheti le az utasítás eredményeit.
A Databricks a következő ajánlott biztonsági eljárásokat javasolja a Databricks SQL Statement Execution API használatakor, valamint a EXTERNAL_LINKS
nagyméretű adatkészletek lekérésére vonatkozó diszpozícióval együtt:
- Az Azure Storage-kérelmek Databricks-engedélyezési fejlécének eltávolítása
- SAS-URL-címek és SAS-jogkivonatok védelme
A EXTERNAL_LINKS
letiltás kérelemre letiltható egy támogatási eset létrehozásával. A kérés teljesítéséhez forduljon az Azure Databricks-fiók csapatához.
Az Azure Storage-kérelmek Databricks-engedélyezési fejlécének eltávolítása
A Databricks SQL Utasítás végrehajtási API-jának minden olyan curl
hívásának tartalmaznia kell egy Authorization
fejlécet, amely tartalmazza az Azure Databricks hozzáférési hitelesítő adatait. Ne adja meg ezt a Authorization
fejlécet, amikor adatokat tölt le az Azure Storage-ból. Ez a fejléc nem szükséges, és előfordulhat, hogy véletlenül elérhetővé teszi az Azure Databricks hozzáférési hitelesítő adatait.
SAS-URL-címek és SAS-jogkivonatok védelme
A diszpozíció használatakor EXTERNAL_LINKS
létrejön egy rövid élettartamú SAS URL-cím, amellyel a hívó közvetlenül az Azure Storage-ból töltheti le az eredményeket a TLS használatával. Mivel egy rövid élettartamú SAS-jogkivonat van beágyazva ebbe az SAS URL-címbe, az SAS URL-címet és az SAS-jogkivonatot is védenie kell.