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.
- A két nyelv feldolgozási paradigmáinak összehasonlításával kezdődik
- Tippek a következőhöz:
- Szkriptek átalakítása, beleértve az U-SQL sorhalmaz-kifejezéseit
- .NET-kód
- Adattípusok
- Katalógusobjektumok
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:
- 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. - 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.
- 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_name
vannak 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_name
nem 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
/SEMI
JOIN
KifejezésekCROSS
/OUTER
APPLY
KifejezésekPIVOT
/UNPIVOT
KifejezésekVALUES
sorkészlet-konstruktorKifejezé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 (
SUM
FIRST
stb.) - Néhány legismertebb SQL skaláris kifejezés:
CASE
, ,LIKE
(NOT
)IN
,AND
stbOR
.
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
- A Spark-adatformátumok ismertetése U-SQL-fejlesztők számára
- .NET az Apache Sparkhoz
- Big Data Analytics-megoldások frissítése az Azure Data Lake Storage Gen1-ről az Azure Data Lake Storage Gen2-re
- Adatok átalakítása Spark-tevékenység használatával az Azure Data Factoryben
- Adatok átalakítása Hadoop Hive-tevékenység használatával az Azure Data Factoryben
- Mi az az Apache Spark az Azure HDInsightban?