Megosztás a következőn keresztül:


Delta Lake-fájlok (v1) lekérdezése kiszolgáló nélküli SQL-készlet használatával az Azure Synapse Analyticsben

Ebben a cikkben megtudhatja, hogyan írhat lekérdezést kiszolgáló nélküli Synapse SQL-készlet használatával a Delta Lake-fájlok olvasásához. A Delta Lake egy nyílt forráskódú tárolási réteg, amely ACID-tranzakciókat (atomitást, konzisztenciát, elkülönítést és tartósságot) hoz létre az Apache Spark és a big data számítási feladatok számára. A Delta Lake-táblák lekérdezésével kapcsolatos videóból többet is megtudhat.

Fontos

A kiszolgáló nélküli SQL-készletek lekérdezhetik a Delta Lake 1.0-s verzióját. A Delta Lake 1.2-es verziója, például az oszlopok átnevezése óta bevezetett módosítások kiszolgáló nélküli verziókban nem támogatottak. Ha a Delta magasabb verzióit használja törlési vektorokkal, v2-ellenőrzőpontokkal és másokkal, fontolja meg más lekérdezési motor használatát, például a Lakehouse-hoz készült Microsoft Fabric SQL-végpontot.

A Synapse-munkaterület kiszolgáló nélküli SQL-készlete lehetővé teszi a Delta Lake formátumban tárolt adatok olvasását és jelentéskészítési eszközökhöz való kiszolgálását. A kiszolgáló nélküli SQL-készlet képes olvasni az Apache Spark, az Azure Databricks vagy a Delta Lake formátum bármely más gyártója által létrehozott Delta Lake-fájlokat.

Az Azure Synapse Apache Spark-készletei lehetővé teszik az adatmérnökök számára, hogy a Scala, a PySpark és a .NET használatával módosítsák a Delta Lake-fájlokat. A kiszolgáló nélküli SQL-készletek segítségével az adatelemzők jelentéseket hozhatnak létre az adatmérnökök által létrehozott Delta Lake-fájlokról.

Fontos

A Delta Lake-formátum lekérdezése a kiszolgáló nélküli SQL-készlet használatával általánosan elérhető funkció. A Spark Delta-táblák lekérdezése azonban továbbra is nyilvános előzetes verzióban érhető el, és nem áll készen az éles üzemre. Vannak ismert problémák, amelyek akkor fordulhatnak elő, ha a Spark-készletek használatával létrehozott Delta-táblákat kérdezi le. Tekintse meg a kiszolgáló nélküli SQL-készlet ismert problémáinak önsegítő súgóját.

Rövid útmutató – példa

Az OPENROWSET függvény lehetővé teszi a Delta Lake-fájlok tartalmának olvasását a gyökérmappa URL-címének megadásával.

A Delta Lake mappa olvasása

A legegyszerűbben úgy tekintheti DELTA meg a fájl tartalmát, ha megadja a fájl URL-címét az OPENROWSET függvénynek, és megadja DELTA a formátumot. Ha a fájl nyilvánosan elérhető, vagy ha a Microsoft Entra-identitása hozzáfér ehhez a fájlhoz, a fájl tartalmát egy lekérdezéssel kell látnia, mint az alábbi példában látható:

SELECT TOP 10 *
FROM OPENROWSET(
    BULK 'https://sqlondemandstorage.blob.core.windows.net/delta-lake/covid/',
    FORMAT = 'delta') as rows;

Az oszlopnevek és adattípusok automatikusan beolvashatók a Delta Lake-fájlokból. A OPENROWSET függvény a legjobb tipptípusokat használja, például VARCHAR(1000) a sztringoszlopokhoz.

A függvény URI-jának OPENROWSET hivatkoznia kell a Delta Lake gyökérmappára, amely egy úgynevezett _delta_logalmappát tartalmaz.

ECDC COVID-19 Delta Lake mappa

Ha nem rendelkezik ezzel az almappával, akkor nem Delta Lake formátumot használ. A mappában lévő egyszerű Parquet-fájlokat Delta Lake formátumba konvertálhatja a következő Apache Spark Python-szkripttel:

%%pyspark
from delta.tables import DeltaTable
deltaTable = DeltaTable.convertToDelta(spark, "parquet.`abfss://delta-lake@sqlondemandstorage.dfs.core.windows.net/covid`")

A lekérdezések teljesítményének javítása érdekében fontolja meg explicit típusok megadását a WITH záradékban.

Feljegyzés

A kiszolgáló nélküli Synapse SQL-készlet sémakövetkeztetést használ az oszlopok és típusaik automatikus meghatározásához. A sémakövetkeztetés szabályai megegyeznek a Parquet-fájlokéval. Ha a Delta Lake-típust natív SQL-típusra szeretné megfeleltetni, ellenőrizze a Parquet típusleképezését.

Győződjön meg arról, hogy hozzáfér a fájlhoz. Ha a fájl SAS-kulccsal vagy egyéni Azure-identitással van védve, kiszolgálószintű hitelesítő adatokat kell beállítania az SQL-bejelentkezéshez.

Fontos

Győződjön meg arról, hogy UTF-8 adatbázis-rendezést használ (például Latin1_General_100_BIN2_UTF8), mert a Delta Lake-fájlok sztringértékei UTF-8 kódolással vannak kódolva. A Delta Lake-fájl szövegkódolása és a rendezés közötti eltérés váratlan konverziós hibákat okozhat. Az aktuális adatbázis alapértelmezett rendezése egyszerűen módosítható a következő T-SQL utasítással: ALTER DATABASE CURRENT COLLATE Latin1_General_100_BIN2_UTF8; A rendezésekkel kapcsolatos további információkért lásd a Synapse SQL által támogatott rendezési típusokat.

Adatforrások használata

Az előző példák a fájl teljes elérési útját használták. Másik lehetőségként létrehozhat egy külső adatforrást a tároló gyökérmappájára ható hellyel. Miután létrehozta a külső adatforrást, használja az adatforrást és a függvényben lévő OPENROWSET fájl relatív elérési útját. Így nem kell a teljes abszolút URI-t használnia a fájlokhoz. Ezután egyéni hitelesítő adatokat is meghatározhat a tárolási hely eléréséhez.

Fontos

Az adatforrások csak egyéni adatbázisokban hozhatók létre (a főadatbázisban vagy az Apache Spark-készletekből replikált adatbázisokban nem).

Az alábbi minták használatához el kell végeznie a következő lépést:

  1. Hozzon létre egy adatbázist egy olyan adatforrással, amely NYC Yellow Taxi Storage-fiókra hivatkozik.
  2. Inicializálja az objektumokat az 1. lépésben létrehozott adatbázis telepítőszkriptjének végrehajtásával. Ez a beállítási szkript létrehozza az ezekben a mintákban használt adatforrásokat, adatbázis-hatókörű hitelesítő adatokat és külső fájlformátumokat.

Ha létrehozta az adatbázist, és a környezetet az adatbázisra állította át (egy lekérdezésszerkesztőben az adatbázis kiválasztására szolgáló utasítás vagy legördülő lista használatával USE database_name ), létrehozhatja a gyökér URI-t tartalmazó külső adatforrást az adatkészletre, és használhatja a Delta Lake-fájlok lekérdezéséhez:

CREATE EXTERNAL DATA SOURCE DeltaLakeStorage
WITH ( LOCATION = 'https://sqlondemandstorage.blob.core.windows.net/delta-lake/' );
GO

SELECT TOP 10 *
FROM OPENROWSET(
        BULK 'covid',
        DATA_SOURCE = 'DeltaLakeStorage',
        FORMAT = 'delta'
    ) as rows;

Ha egy adatforrás SAS-kulccsal vagy egyéni identitással van védve, az adatforrást adatbázis-hatókörű hitelesítő adatokkal konfigurálhatja.

Explicit módon adja meg a sémát

OPENROWSET lehetővé teszi, hogy explicit módon adja meg, hogy milyen oszlopokat szeretne olvasni a fájlból záradék használatával WITH :

SELECT TOP 10 *
FROM OPENROWSET(
        BULK 'covid',
        DATA_SOURCE = 'DeltaLakeStorage',
        FORMAT = 'delta'
    )
    WITH ( date_rep date,
           cases int,
           geo_id varchar(6)
           ) as rows;

Az eredményhalmaz sémájának explicit specifikációjával minimalizálhatja a típusméreteket, és a pesszimista VARCHAR(1000) helyett a sztringoszlopokhoz a VARCHAR(6) pontosabb típusokat használhatja. A típusok minimalizálása jelentősen javíthatja a lekérdezések teljesítményét.

Fontos

Győződjön meg arról, hogy explicit módon UTF-8 rendezést (például Latin1_General_100_BIN2_UTF8) a záradék összes sztringoszlopához WITH megad, vagy UTF-8 rendezést állít be az adatbázis szintjén. A fájl szövegkódolása és a sztringoszlopok rendezése közötti eltérés váratlan konverziós hibákat okozhat. Az aktuális adatbázis alapértelmezett rendezése egyszerűen módosítható a következő T-SQL utasítással: alter database current collate Latin1_General_100_BIN2_UTF8 A kolumtípusokon egyszerűen beállíthatja a rendezést a következő definícióval: geo_id varchar(6) collate Latin1_General_100_BIN2_UTF8

Adathalmaz

Ebben a mintában nyc sárga taxi adatkészletet használunk. A rendszer az eredeti PARQUET adatkészletet formátummá DELTA alakítja, és a DELTA verziót használja a példákban.

Particionált adatok lekérdezése

Az ebben a mintában megadott adatkészlet külön almappákra van osztva (particionált).

A Parquettől eltérően nem kell meghatározott partíciókat megcélolnia a FILEPATH függvény használatával. A OPENROWSET rendszer azonosítja a particionálási oszlopokat a Delta Lake mappastruktúrájában, és lehetővé teszi az adatok közvetlen lekérdezését ezekkel az oszlopokkal. Ez a példa 2017 első három hónapjának viteldíjösszegét mutatja be év, hónap és payment_type szerint.

SELECT
        YEAR(pickup_datetime) AS year,
        passenger_count,
        COUNT(*) AS cnt
FROM  
    OPENROWSET(
        BULK 'yellow',
        DATA_SOURCE = 'DeltaLakeStorage',
        FORMAT='DELTA'
    ) nyc
WHERE
    nyc.year = 2017
    AND nyc.month IN (1, 2, 3)
    AND pickup_datetime BETWEEN CAST('1/1/2017' AS datetime) AND CAST('3/31/2017' AS datetime)
GROUP BY
    passenger_count,
    YEAR(pickup_datetime)
ORDER BY
    YEAR(pickup_datetime),
    passenger_count;

A OPENROWSET függvény megszünteti azokat a partíciókat, amelyek nem felelnek meg a hol és month a year hol záradéknak. Ez a fájl/partíció metszési technika jelentősen csökkenti az adatkészletet, javítja a teljesítményt, és csökkenti a lekérdezés költségeit.

A függvény mappanevét (ebben a OPENROWSET példában) a rendszer összefűzi az LOCATION adatforrás használatávalDeltaLakeStorage, és hivatkoznia kell a delta lake gyökérmappára, amely egy úgynevezett _delta_logalmappátyellow tartalmaz.

Sárga Taxi Delta Lake mappa

Ha nem rendelkezik ezzel az almappával, akkor nem Delta Lake formátumot használ. A mappában lévő egyszerű Parquet-fájlokat Delta Lake formátumba konvertálhatja a következő Apache Spark Python-szkripttel:

%%pyspark
from delta.tables import DeltaTable
deltaTable = DeltaTable.convertToDelta(spark, "parquet.`abfss://delta-lake@sqlondemandstorage.dfs.core.windows.net/yellow`", "year INT, month INT")

A függvény második argumentuma DeltaTable.convertToDeltaLake a mappamintayear=*/month=* részét képező particionálási oszlopokat (ebben a példában) és azok típusait jelöli.

Korlátozások

Következő lépések

A következő cikkből megtudhatja, hogyan kérdezheti le a parquet beágyazott típusait. Ha folytatni szeretné a Delta Lake-megoldás létrehozását, megtudhatja, hogyan hozhat létre nézeteket vagy külső táblákat a Delta Lake mappában.

Lásd még