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


Az Apache Spark-kód ismertetése U-SQL-fejlesztők számára

Fontos

Az Azure Data Lake Analytics 2024. február 29-én megszűnt. További információ a bejelentésről.

Az adatelemzéshez a szervezet használhatja az Azure Synapse Analyticset vagy a Microsoft Fabricet.

Ez a szakasz magas szintű útmutatást nyújt az U-SQL-szkriptek Apache Sparkra való átalakításához.

Az U-SQL és a Spark nyelvének és feldolgozási paradigmáinak megismerése

Mielőtt megkezdené az Azure Data Lake Analytics U-SQL-szkriptjeinek Sparkba való migrálását, érdemes megismernie a két rendszer általános nyelvét és feldolgozási filozófiáját.

A U-SQL egy SQL-szerű deklaratív lekérdezési nyelv, amely adatfolyam-paradigmát használ, és lehetővé teszi a .NET-ben (például C#), Pythonban és R-ben írt felhasználói kód egyszerű beágyazását és horizontális felskálázását. A felhasználói bővítmények egyszerű kifejezéseket vagy felhasználó által definiált függvényeket implementálhatnak, de lehetővé teszik az úgynevezett felhasználó által definiált operátorok implementálását is, amelyek egyéni operátorokat implementálnak a sorhalmazszintű átalakítások, kinyerések és kimenetek írása céljából.

A Spark egy horizontális felskálázási keretrendszer, amely több nyelvi kötést kínál a Scalában, a Java-ban, a Pythonban, a .NET-ben stb., ahol a kódot elsősorban ezen nyelvek egyikébe írja, rugalmas elosztott adathalmazoknak (RDD), adatkereteknek és adathalmazoknak nevezett adat absztrakciókat hoz létre, majd linq-szerű tartományspecifikus nyelvet (DSL) használ az átalakításukhoz. A SparkSQL-t deklaratív alnyelvként is biztosítja az adatkereten és az adathalmaz absztrakcióin. A DSL a műveletek, átalakítások és műveletek két kategóriáját biztosítja. Ha átalakításokat alkalmaz az adat absztrakciókra, az nem hajtja végre az átalakítást, hanem egy művelettel elkészíti a kiértékelendő végrehajtási tervet (például az eredményt egy ideiglenes táblába vagy fájlba írja, vagy kinyomtatja az eredményt).

Így amikor egy U-SQL-szkriptet Spark-programba fordít, el kell döntenie, hogy melyik nyelvet szeretné használni legalább az adatkeret absztrakciójának létrehozásához (amely jelenleg a leggyakrabban használt adat absztrakció), és hogy meg szeretné-e írni a deklaratív adatfolyam-átalakításokat a DSL vagy a SparkSQL használatával. Néhány összetettebb esetben előfordulhat, hogy fel kell osztania az U-SQL-szkriptet egy Spark-sorozatra, valamint az Azure Batch vagy az Azure Functions használatával végrehajtott egyéb lépésekre.

Ezenkívül az Azure Data Lake Analytics egy kiszolgáló nélküli feladatszolgáltatás-környezetben kínál U-SQL-t, ahol az erőforrások minden feladathoz vannak lefoglalva, míg az Azure Synapse Spark, az Azure Databricks és az Azure HDInsight a Sparkot fürtszolgáltatás formájában vagy úgynevezett Spark-készletsablonokkal kínálja. Az alkalmazás átalakításakor figyelembe kell vennie a fürtök vagy készletek létrehozásának, méretezésének, méretezésének és leszerelésének következményeit.

U-SQL-szkriptek átalakítása

Az U-SQL-szkriptek a következő feldolgozási mintát követik:

  1. Az adatok strukturálatlan fájlokból, az EXTRACT utasítással, a hely- vagy fájlkészlet-specifikációval, a beépített vagy felhasználó által definiált elszívóval és a kívánt sémával, illetve U-SQL-táblákból (felügyelt vagy külső táblákból) lesznek beolvasva. Sorhalmazként van ábrázolva.
  2. A sorhalmazok több U-SQL utasításban lesznek átalakítva, amelyek U-SQL-kifejezéseket alkalmaznak a sorhalmazokra, és új sorhalmazokat hoznak létre.
  3. Végül az eredményül kapott sorhalmazok a hely(ek) és egy beépített vagy felhasználó által definiált kimenetet meghatározó utasítással OUTPUT vagy egy U-SQL-táblában lévő fájlba kerülnek.

A szkript kiértékelése lazán történik, ami azt jelenti, hogy minden egyes kinyerési és átalakítási lépés egy kifejezésfából áll, és globálisan ki lesz értékelve (az adatfolyam).

A Spark-programok hasonlóak ahhoz, hogy a Spark-összekötőkkel beolvassa az adatokat, és létrehozza az adatkereteket, majd alkalmazza az átalakításokat az adatkereteken a LINQ-szerű DSL vagy SparkSQL használatával, majd írja be az eredményt fájlokba, ideiglenes Spark-táblákba, bizonyos programozási nyelvtípusokba vagy a konzolba.

.NET-kód átalakítása

A U-SQL kifejezési nyelve a C# és különböző módokon skálázható fel az egyéni .NET-kód felhasználó által definiált függvényekkel, felhasználó által definiált operátorokkal és felhasználó által definiált összesítőkkel.

Az Azure Synapse és az Azure HDInsight Spark mostantól natív módon támogatja a .NET-kód végrehajtását az Apache Sparkhoz készült .NET-tel. Ez azt jelenti, hogy a Sparkkal esetleg újra felhasználhatja a .NET felhasználó által definiált egyes függvényeit. Vegye figyelembe, hogy a U-SQL a .NET-keretrendszer használja, míg az Apache Sparkhoz készült .NET a .NET Core 3.1-es vagy újabb verzióján alapul.

A felhasználói U-SQL-operátorok (UDO-k) az U-SQL UDO-modellt használják az operátor kódjának kibővített végrehajtásához. Így az UDR-eket újra kell írni a felhasználó által definiált függvényekbe, hogy illeszkedjenek a Spark végrehajtási modelljébe.

Az Apache Sparkhoz készült .NET jelenleg nem támogatja a felhasználó által definiált összesítőket. Így az U-SQL felhasználó által definiált összesítőit a Scalában írt Spark-felhasználó által definiált összesítőkre kell lefordítani.

Ha nem szeretné kihasználni az Apache Spark .NET-funkcióit, a kifejezéseket át kell írnia egy egyenértékű Spark-, Scala-, Java- vagy Python-kifejezésre, függvényre, összesítőre vagy összekötőre.

Ha nagy mennyiségű .NET-logikával rendelkezik az U-SQL-szkriptekben, további útmutatásért forduljon hozzánk a Microsoft-fiók képviselőjén keresztül.

Az alábbi részletek az U-SQL-szkriptek .NET- és C#-használati eseteit ismertetik.

Skaláris beágyazott U-SQL C# kifejezések átalakítása

Az U-SQL kifejezési nyelve C#. A skaláris beágyazott U-SQL-kifejezések nagy része natív módon van implementálva a jobb teljesítmény érdekében, míg összetettebb kifejezések is végrehajthatók a .NET-keretrendszerbe való behívással.

A Spark saját skaláris kifejezési nyelvvel rendelkezik (akár a DSL részeként, akár a SparkSQL-ben), és lehetővé teszi a JVM, .NET vagy Python futtatókörnyezethez írt, felhasználó által definiált függvények behívását.

Ha skaláris kifejezéseket használ az U-SQL-ben, először meg kell találnia a legmegfelelőbb natívan értelmezett Spark skaláris kifejezést, hogy a lehető legjobb teljesítményt érje el, majd a többi kifejezést a választott Spark-futtatókörnyezet nyelvének felhasználó által definiált függvényére képezheti le.

Vegye figyelembe, hogy a .NET és a C# típusszemantika eltér a JVM-hez és Python-futtatókörnyezetekhez és a Spark DSL-jeihez képest. A típusrendszer-különbségekről az alábbiakban olvashat bővebben.

Felhasználó által definiált skaláris .NET-függvények és felhasználó által definiált összesítők átalakítása

A U-SQL lehetővé teszi tetszőleges skaláris .NET-függvények meghívását és a .NET-ben írt felhasználó által definiált összesítők meghívását.

A Spark emellett támogatja a felhasználó által definiált függvényeket és a felhasználó által definiált összesítőket, amelyeket a legtöbb üzemeltetési nyelven írnak, és amelyek meghívhatók a Spark DSL-ből és a SparkSQL-ből.

Ahogy fentebb említettük, az Apache Sparkhoz készült .NET támogatja a .NET-ben írt, felhasználó által definiált függvényeket, de nem támogatja a felhasználó által definiált összesítőket. A felhasználó által definiált függvények esetében tehát az Apache Sparkhoz készült .NET használható, míg a felhasználó által definiált összesítőket a Scala for Sparkban kell létrehozni.

Felhasználó által definiált operátorok (UDO-k) átalakítása

Az U-SQL a felhasználó által definiált operátorok (UDO-k) számos kategóriáját biztosítja, például az elszívókat, a kimenetiket, a reduktorokat, a processzorokat, az appliereket és a kombinátorokat, amelyek .NET-ben (és - bizonyos mértékig - Pythonban és R-ben) írhatók.

A Spark nem ugyanazt a bővíthetőségi modellt kínálja az operátorok számára, de néhányhoz hasonló képességekkel rendelkezik.

Az elszívókkal és a kimenetikkel egyenértékű Spark-összekötők. Számos U-SQL-kiszívó esetében a Spark-közösségben talál egy egyenértékű összekötőt. Másoknak egyéni összekötőt kell írnia. Ha az U-SQL-elszívó összetett, és több .NET-kódtárat használ, célszerű lehet olyan összekötőt létrehozni a Scalában, amely interop használatával hívja meg az adatokat ténylegesen feldolgozó .NET-kódtárat. Ebben az esetben üzembe kell helyeznie a .NET Core-futtatókörnyezetet a Spark-fürtben, és meg kell győződnie arról, hogy a hivatkozott .NET-kódtárak .NET Standard 2.0-s szabványnak megfelelőek.

Az U-SQL UUD-k egyéb típusait felhasználó által definiált függvényekkel és összesítőkkel, valamint a szemantikailag megfelelő Spark DLS- vagy SparkSQL-kifejezéssel kell újraírni. Egy processzor például leképezhető a különböző UDF-hívásokat tartalmazó SELECT értékre, amely egy olyan függvényként van csomagolva, amely argumentumként egy adatkeretet vesz fel, és egy adatkeretet ad vissza.

A U-SQL választható kódtárainak átalakítása

A U-SQL opcionális és demó kódtárak készletét biztosítja, amelyek Python, R, JSON, XML, AVRO-támogatást és néhány Azure AI-szolgáltatási funkciót kínálnak.

A Spark saját Python- és R-integrációt, pySparkot és SparkR-t kínál, és összekötőket biztosít JSON, XML és AVRO olvasásához és írásához.

Ha át kell alakítania egy, az Azure AI-szolgáltatáskódtárakra hivatkozó szkriptet, javasoljuk, hogy lépjen kapcsolatba velünk a Microsoft-fiók képviselőjén keresztül.

Beírt értékek átalakítása

Mivel az U-SQL típusrendszere a .NET típusrendszeren alapul, és a Sparknak saját típusrendszere van, amelyet a gazdanyelv-kötés érint, meg kell győződnie arról, hogy a használt típusok közel vannak, és bizonyos típusok esetében a típustartományok, a pontosság és/vagy a skálázás kissé eltérő lehet. Az U-SQL és a Spark emellett másképp kezeli null az értékeket.

Adattípusok

Az alábbi táblázat a Spark, a Scala és a PySpark megfelelő típusait tartalmazza az adott U-SQL-típusok esetében.

U-SQL Spark Scala PySpark
byte
sbyte ByteType Byte ByteType
int IntegerType Int IntegerType
uint
long LongType Long LongType
ulong
float FloatType Float FloatType
double DoubleType Double DoubleType
decimal DecimalType java.math.BigDecimal DecimalType
short ShortType Short ShortType
ushort
char Char
string StringType String StringType
DateTime DateType, TimestampType java.sql.Date, java.sql.Timestamp DateType, TimestampType
bool BooleanType Boolean BooleanType
Guid
byte[] BinaryType Array[Byte] BinaryType
SQL.MAP<K,V> MapType(keyType, valueType, valueContainsNull) scala.collection.Map MapType(keyType, valueType, valueContainsNull=True)
SQL.ARRAY<T> ArrayType(elementType, containsNull) scala.collection.Seq ArrayType(elementType, containsNull=True)

További információk:

A NULL kezelése

A Sparkban az alapértelmezett típusok engedélyezik a NULL értékeket, míg az U-SQL-ben explicit módon megjelöli a skaláris, nem objektumos értékeket null értékűként. Bár a Spark lehetővé teszi, hogy az oszlopokat nem null értékűként definiálja, nem kényszeríti ki a kényszert, és helytelen eredményhez vezethet.

A Sparkban a NULL azt jelzi, hogy az érték ismeretlen. A Spark NULL értéke különbözik minden értéktől, beleértve magát is. Két Spark NULL érték vagy egy NULL érték és bármely más érték összehasonlítása ismeretlen értéket ad vissza, mert az egyes NULL értékek értéke ismeretlen.

Ez a viselkedés eltér az U-SQL-től, amely a C#-szemantikát követi, ahol null különbözik minden értéktől, de egyenlő önmagával.

Így egy SparkSQL-utasítás SELECT , amely nulla sort ad WHERE column_name = NULL vissza akkor is, ha NULL értékek column_namevannak benne, míg az U-SQL-ben azokat a sorokat adja vissza, amelyekre column_name be van állítva null. Hasonlóképpen, a Spark-utasítás SELECT nulla sort ad WHERE column_name != NULL vissza akkor is, ha a U-SQL-ben column_namenem null értékű sorok vannak. Így ha az U-SQL null-ellenőrző szemantikáját szeretné használni, akkor az isullt és az isotnullt (vagy azok DSL-ekvivalensét) kell használnia.

U-SQL-katalógusobjektumok átalakítása

Az egyik fő különbség az, hogy az U-SQL-szkriptek használhatják katalógusobjektumait, amelyek közül sok nem rendelkezik közvetlen Spark-megfelelővel.

A Spark támogatja a Hive-metatár fogalmait, elsősorban az adatbázisokat, táblákat és nézeteket, így U-SQL-adatbázisokat és sémákat képezhet le Hive-adatbázisokhoz, U-SQL-táblákat Pedig Spark-táblákhoz (lásd : U-SQL-táblákban tárolt adatok áthelyezése), de nem támogatja a táblaértékű függvényeket (TVF-eket), a tárolt eljárásokat, az U-SQL-szerelvényeket, a külső adatforrásokat stb.

Az U-SQL-kódobjektumok, például nézetek, TVF-ek, tárolt eljárások és szerelvények a Spark kódfüggvényei és kódtárai alapján modellezhetők, és a gazdanyelv függvényei és eljárási absztrakciós mechanizmusai (például Python-modulok importálásával vagy Scala-függvényekre való hivatkozással) hivatkozhatók.

Ha az U-SQL-katalógust arra használták, hogy adatokat és kódobjektumokat osszon meg projektekben és csapatokban, akkor egyenértékű megosztási mechanizmusokat kell használni (például a Kódobjektumok megosztására szolgáló Mavent).

U-SQL-sorok és SQL-alapú skaláris kifejezések átalakítása

Az U-SQL alapvető nyelve a sorok halmazainak átalakítása, és SQL-alapú. Az alábbiakban az U-SQL-ben kínált leggyakoribb sorhalmazkifejezések nem kimerítő listája található:

  • SELECT/FROM/WHERE/GROUP BY+Összesítések+HAVING/ORDER BY+FETCH

  • INNER/OUTER/CROSS/SEMIJOIN Kifejezések

  • CROSS/OUTERAPPLY Kifejezések

  • PIVOT/UNPIVOT Kifejezések

  • VALUES sorkészlet-konstruktor

  • Kifejezések beállítása UNION/OUTER UNION/INTERSECT/EXCEPT

Az U-SQL emellett különböző SQL-alapú skaláris kifejezéseket is biztosít, például

  • OVER ablakos kifejezések
  • különböző beépített összesítők és rangsorolási függvények (SUMFIRSTstb.)
  • Néhány legismertebb SQL skaláris kifejezés: CASE, , LIKE(NOT) IN, ANDstb OR .

A Spark a legtöbb kifejezéshez egyenértékű kifejezéseket kínál DSL és SparkSQL formájában is. A Sparkban natív módon nem támogatott kifejezések némelyikét a natív Spark-kifejezések és szemantikailag egyenértékű minták kombinációjával kell újraírni. Például OUTER UNION a prognózisok és az egyesítések egyenértékű kombinációjára kell lefordítani.

A NULL értékek eltérő kezelése miatt az U-SQL-illesztés mindig megfelel egy sornak, ha az összehasonlítandó oszlopok mindegyike NULL értéket tartalmaz, míg a Sparkban lévő illesztés csak akkor egyezik meg az ilyen oszlopokkal, ha explicit null-ellenőrzéseket adnak hozzá.

Egyéb U-SQL-fogalmak átalakítása

Az U-SQL számos egyéb funkciót és fogalmat is kínál, például összevont lekérdezéseket az SQL Server-adatbázisok, paraméterek, skaláris és lambda kifejezésváltozók, rendszerváltozók és OPTION tippek alapján.

Összevont lekérdezések SQL Server-adatbázisokon/külső táblákon

A U-SQL adatforrásokat és külső táblákat, valamint közvetlen lekérdezéseket biztosít az Azure SQL Database-hez. Bár a Spark nem ugyanazokat az objektum absztrakciókat kínálja, spark-összekötőt biztosít az Azure SQL Database-hez , amely sql-adatbázisok lekérdezésére használható.

U-SQL-paraméterek és változók

A paraméterek és a felhasználói változók egyenértékű fogalmakkal rendelkeznek a Sparkban és azok üzemeltetési nyelveiben.

A Scalában például definiálhat egy változót a var kulcsszóval:

var x = 2 * 3;
println(x)

Az U-SQL rendszerváltozói (a @@változók kezdő) két kategóriába sorolhatók:

  • Olyan rendszerváltozók beállítása, amelyek meghatározott értékekre állíthatók be, hogy befolyásolják a szkriptek viselkedését
  • Információs rendszerváltozók, amelyek rendszer- és feladatszintű információkat kérdeznek le

A settable rendszerváltozók többsége nem rendelkezik közvetlen egyenértékű értékkel a Sparkban. Az információs rendszer változóinak egy része modellezhető úgy, hogy argumentumként adja át az adatokat a feladat végrehajtása során, másoknak a Spark üzemeltetési nyelvének megfelelő függvénye lehet.

U-SQL-tippek

A U-SQL számos szintaktikai módszert kínál a lekérdezésoptimalizáló és -végrehajtó motor számára:

  • U-SQL rendszerváltozó beállítása
  • a OPTION sorkészlet-kifejezéshez társított záradék, amely adatokat vagy tervmutatót ad meg
  • illesztésmutató az illesztés kifejezés szintaxisában (például BROADCASTLEFT)

A Spark költségalapú lekérdezésoptimalizálója saját képességekkel rendelkezik, hogy tippeket nyújtson és hangolja a lekérdezés teljesítményét. Tekintse meg a megfelelő dokumentációt.

Következő lépések