Vysvětlení kódu Apache Sparku pro vývojáře U-SQL
Důležité
Služba Azure Data Lake Analytics byla vyřazena 29. února 2024. Další informace najdete v tomto oznámení.
K analýze dat může vaše organizace používat Azure Synapse Analytics nebo Microsoft Fabric.
Tato část obsahuje základní pokyny k transformaci skriptů U-SQL na Apache Spark.
- Začíná porovnáním paradigmat zpracování dvou jazyků.
- Obsahuje tipy, jak:
- Transformace skriptů včetně výrazů sady řádků U-SQL
- Kód .NET
- Datové typy
- Objekty katalogu
Vysvětlení paradigmatu jazyka U-SQL a Sparku a zpracování
Než začnete migrovat skripty U-SQL služby Azure Data Lake Analytics do Sparku, je užitečné porozumět obecnému jazyku a zpracování filozofie obou systémů.
U-SQL je deklarativní dotazovací jazyk podobný JAZYKu SQL, který používá paradigma toku dat a umožňuje snadno vkládat a škálovat uživatelský kód napsaný v .NET (například C#), Python a R. Uživatelská rozšíření mohou implementovat jednoduché výrazy nebo uživatelem definované funkce, ale mohou také poskytnout uživateli možnost implementovat tzv. uživatelem definované operátory, které implementují vlastní operátory k provádění transformací, extrakcí a zápisu na úrovni řádků.
Spark je architektura se škálováním na více instancí, která nabízí několik jazykových vazeb v jazyce Scala, Java, Python, .NET atd., kde primárně píšete kód v jednom z těchto jazyků, vytváříte abstrakce dat označované jako odolné distribuované datové sady (RDD), datové rámce a datové sady a pak je transformujete pomocí jazyka SPECIFICKÉho pro doménu (DSL) podobného LINQ. Poskytuje také SparkSQL jako deklarativní sublanguage pro abstrakce datového rámce a datové sady. DSL poskytuje dvě kategorie operací, transformací a akcí. Použití transformací na abstrakce dat nespustí transformaci, ale místo toho se sestaví plán provádění, který se odešle k vyhodnocení pomocí akce (například zápis výsledku do dočasné tabulky nebo souboru nebo tisku výsledku).
Proto při překladu skriptu U-SQL do programu Spark budete muset rozhodnout, který jazyk chcete použít k alespoň vygenerování abstrakce datového rámce (což je aktuálně nejčastěji používané abstrakce dat) a jestli chcete zapsat deklarativní transformace toku dat pomocí DSL nebo SparkSQL. V některých složitějších případech možná budete muset rozdělit skript U-SQL do posloupnosti Sparku a dalších kroků implementovaných ve službě Azure Batch nebo Azure Functions.
Kromě toho Azure Data Lake Analytics nabízí U-SQL v prostředí bezserverové služby úloh, kde jsou prostředky přiděleny pro každou úlohu, zatímco Azure Synapse Spark, Azure Databricks a Azure HDInsight nabízejí Spark ve formě služby clusteru nebo s takzvanými šablonami fondu Spark. Při transformaci aplikace budete muset vzít v úvahu důsledky vytváření, velikosti, škálování a vyřazení clusterů nebo fondů z provozu.
Transformace skriptů U-SQL
Skripty U-SQL se řídí následujícím vzorem zpracování:
- Data se čtou buď z nestrukturovaných souborů, pomocí
EXTRACT
příkazu, specifikace umístění nebo sady souborů a integrovaného nebo uživatelem definovaného extraktoru a požadovaného schématu nebo z tabulek U-SQL (spravovaných nebo externích tabulek). Je reprezentovaná jako sada řádků. - Sady řádků se transformují v několika příkazech U-SQL, které na sady řádků aplikují výrazy U-SQL a vytvoří nové sady řádků.
- Výsledné sady řádků jsou nakonec výstupem do souborů pomocí
OUTPUT
příkazu, který určuje umístění a předdefinovaný nebo uživatelem definovaný výstup nebo do tabulky U-SQL.
Skript se vyhodnocuje laziálně, což znamená, že každý krok extrakce a transformace se skládá do stromu výrazů a globálně vyhodnocený (tok dat).
Programy Sparku se podobají tomu, že byste ke čtení dat použili konektory Sparku a vytvořili datové rámce, pak na datových rámcích použili transformace pomocí LINQ-like DSL nebo SparkSQL a potom zapisujte výsledek do souborů, dočasných tabulek Sparku, některých typů programovacích jazyků nebo konzoly.
Transformace kódu .NET
Jazyk výrazů U-SQL je jazyk C# a nabízí různé způsoby, jak škálovat vlastní kód .NET s uživatelsky definovanými funkcemi, uživatelem definovanými operátory a agregátory definovanými uživatelem.
Azure Synapse i Azure HDInsight Spark teď nativně podporují spouštění kódu .NET s .NET pro Apache Spark. To znamená, že pomocí Sparku můžete potenciálně znovu použít některé nebo všechny uživatelem definované funkce .NET. Všimněte si, že U-SQL používá rozhraní .NET Framework, zatímco .NET pro Apache Spark je založeno na .NET Core 3.1 nebo novější.
Uživatelem definované operátory U-SQL (UDO) používají model UDO U-SQL k zajištění provádění kódu operátora se škálováním na více instancí. Objekty definované uživatelem se proto musí přepsat do uživatelem definovaných funkcí, aby se vešly do modelu spouštění Sparku.
.NET pro Apache Spark v současné době nepodporuje agregátory definované uživatelem. Agregátory definované uživatelem U-SQL proto musí být přeloženy do agregátorů definovaných uživatelem Sparku napsaných v jazyce Scala.
Pokud nechcete využívat výhod funkcí .NET pro Apache Spark, budete muset přepsat výrazy do ekvivalentního výrazu Spark, Scala, Javy nebo Pythonu, funkce, agregátoru nebo konektoru.
Pokud máte v skriptech U-SQL velkou logiku .NET, kontaktujte nás prosím prostřednictvím zástupce účtu Microsoft a požádejte nás o další pokyny.
Následující podrobnosti jsou určené pro různé případy použití .NET a C# ve skriptech U-SQL.
Transformace skalárních vložených výrazů U-SQL jazyka C#
Jazyk výrazů U-SQL je C#. Mnoho skalárních vložených výrazů U-SQL se nativně implementuje pro lepší výkon, zatímco složitější výrazy je možné provést voláním do rozhraní .NET Framework.
Spark má svůj vlastní jazyk skalárních výrazů (buď jako součást DSL nebo v SparkSQL), a umožňuje volání do uživatelem definovaných funkcí napsaných pro modul runtime JVM, .NET nebo Python.
Pokud máte skalární výrazy v U-SQL, měli byste nejprve najít nejvhodnější skalární výraz Sparku, abyste získali nejvyšší výkon, a pak namapovat ostatní výrazy na uživatelem definovanou funkci jazyka runtime Spark podle vašeho výběru.
Mějte na paměti, že .NET a C# mají jinou sémantiku typu než moduly runtime JVM a Python a DSL Sparku. Další podrobnosti o rozdílech v systému typů najdete níže .
Transformace uživatelem definovaných skalárních funkcí .NET a agregátorů definovaných uživatelem
U-SQL poskytuje způsoby volání libovolných skalárních funkcí .NET a volání uživatelem definovaných agregátorů napsaných v .NET.
Spark také nabízí podporu uživatelem definovaných funkcí a agregátorů definovaných uživatelem napsaných ve většině hostitelských jazyků, které je možné volat z DSL Sparku a SparkSQL.
Jak už bylo zmíněno výše, .NET pro Apache Spark podporuje uživatelem definované funkce napsané v .NET, ale nepodporuje agregátory definované uživatelem. Pro uživatelem definované funkce je možné použít .NET pro Apache Spark, zatímco agregátory definované uživatelem musí být vytvořené v jazyce Scala for Spark.
Transformace uživatelem definovaných operátorů (UDO)
U-SQL poskytuje několik kategorií uživatelem definovaných operátorů (UDO), jako jsou extraktory, výstupy, reduktory, procesory, appliery a kombinátory, které lze psát v .NET (a v určitém rozsahu – v Pythonu a R).
Spark nenabízí stejný model rozšiřitelnosti pro operátory, ale má pro některé ekvivalentní funkce.
Ekvivalentem Sparku pro extraktory a výstupní moduly jsou konektory Sparku. U mnoha extraktorů U-SQL můžete najít ekvivalentní konektor v komunitě Sparku. Pro ostatní budete muset napsat vlastní konektor. Pokud je extrakce U-SQL složitá a využívá několik knihoven .NET, může být vhodnější vytvořit konektor v jazyce Scala, který používá interop k volání do knihovny .NET, která provádí skutečné zpracování dat. V takovém případě budete muset nasadit modul runtime .NET Core do clusteru Spark a ujistit se, že odkazované knihovny .NET jsou kompatibilní se standardem .NET Standard 2.0.
Ostatní typy U-SQL UDO bude potřeba přepsat pomocí uživatelem definovaných funkcí a agregátorů a sémanticky odpovídajícího výrazu Spark DLS nebo SparkSQL. Například procesor lze namapovat na SELECT různých volání uživatelem definovaných uživatelem zabalených jako funkci, která přebírá datový rámec jako argument a vrací datový rámec.
Transformace volitelných knihoven U-SQL
U-SQL poskytuje sadu volitelných a ukázkových knihoven, které nabízejí python, R, JSON, XML, podporu AVRO a některé možnosti služeb Azure AI.
Spark nabízí vlastní integraci Pythonu a R, pySpark a SparkR a poskytuje konektory pro čtení a zápis JSON, XML a AVRO.
Pokud potřebujete transformovat skript odkazující na knihovny služeb Azure AI, doporučujeme nás kontaktovat prostřednictvím zástupce účtu Microsoft.
Transformované hodnoty typu
Vzhledem k tomu, že systém typů U-SQL je založený na systému typů .NET a Spark má svůj vlastní systém typů, který má vliv na vazbu jazyka hostitele, musíte se ujistit, že typy, na kterých pracujete, jsou blízko a pro určité typy, rozsahy typů, přesnost a/nebo škálování se můžou mírně lišit. Kromě toho U-SQL a Spark zachází s null
hodnotami odlišně.
Datové typy
Následující tabulka poskytuje ekvivalentní typy ve Sparku, Scala a PySpark pro dané typy U-SQL.
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) |
Další informace naleznete v tématu:
Léčba hodnoty NULL
Ve Sparku typy ve výchozím nastavení povolují hodnoty NULL v U-SQL, explicitně označíte skalární objekt, který není objekt s možnou hodnotou null. I když Spark umožňuje definovat sloupec jako nenulový, nevynucuje omezení a může vést k nesprávnému výsledku.
Hodnota NULL ve Sparku značí, že hodnota je neznámá. Hodnota Spark NULL se liší od jakékoli hodnoty, včetně samotné. Porovnání mezi dvěma hodnotami Spark NULL nebo mezi hodnotou NULL a jinou hodnotou vrátí neznámou, protože hodnota každé hodnoty NULL je neznámá.
Toto chování se liší od jazyka U-SQL, který se řídí sémantikou jazyka C#, kde se liší od jakékoli hodnoty, ale null
je rovno sobě.
Proto příkaz SparkSQL SELECT
, který používá WHERE column_name = NULL
nulové řádky, i když existují hodnoty NULL v column_name
, zatímco U-SQL, vrátí řádky, kde column_name
je nastavena null
. Podobně příkaz Spark SELECT
, který používá WHERE column_name != NULL
nulové řádky i v případě, že v jazyce U-SQL existují nenulové hodnoty column_name
, vrátí řádky, které nemají hodnotu null. Pokud tedy chcete sémantiku kontroly null U-SQL použít, měli byste použít isnull a isnotnull (nebo jejich ekvivalent DSL).
Transformace objektů katalogu U-SQL
Jedním z hlavních rozdílů je, že skripty U-SQL mohou využívat své objekty katalogu, z nichž mnohé nemají žádný přímý ekvivalent Sparku.
Spark poskytuje podporu konceptů úložiště metadat Hive, zejména databází, tabulek a zobrazení, takže můžete mapovat databáze a schémata U-SQL na databáze Hive a tabulky U-SQL do tabulek Sparku (viz Přesun dat uložených v tabulkách U-SQL), ale nemá žádnou podporu pro funkce s hodnotami tabulky (TVF), uložené procedury, sestavení U-SQL, externí zdroje dat atd.
Objekty kódu U-SQL, jako jsou zobrazení, TVF, uložené procedury a sestavení, je možné modelovat prostřednictvím funkcí a knihoven kódu ve Sparku a odkazovat na tyto objekty pomocí funkcí hostitelského jazyka a procedurálních abstrakcí (například importem modulů Pythonu nebo odkazováním na funkce Scala).
Pokud byl katalog U-SQL použit ke sdílení dat a objektů kódu napříč projekty a týmy, je potřeba použít ekvivalentní mechanismy pro sdílení (například Maven pro sdílení objektů kódu).
Transformace výrazů sady řádků U-SQL a skalárních výrazů založených na SQL
Základní jazyk U-SQL transformuje sady řádků a je založený na SQL. Následuje neexhausivní seznam nejběžnějších výrazů sady řádků nabízených v U-SQL:
SELECT
/FROM
/WHERE
/GROUP BY
+Aggregates+HAVING
/ORDER BY
+FETCH
INNER
/OUTER
/CROSS
/SEMI
JOIN
výrazyCROSS
/OUTER
APPLY
výrazyPIVOT
/UNPIVOT
výrazyVALUES
konstruktor sady řádkůNastavení výrazů
UNION
/OUTER UNION
/INTERSECT
/EXCEPT
Kromě toho U-SQL poskytuje různé skalární výrazy založené na SQL, jako je například
OVER
výrazy oken- různé předdefinované agregátory a funkce řazení (
SUM
FIRST
atd.) - Některé z nejznámějších skalárních výrazů SQL:
CASE
,LIKE
, (NOT
)IN
atdAND
OR
.
Spark nabízí ekvivalentní výrazy ve své podobě DSL i SparkSQL pro většinu těchto výrazů. Některé výrazy, které nejsou nativně podporovány ve Sparku, se budou muset přepsat pomocí kombinace nativních výrazů Sparku a sémanticky ekvivalentních vzorů. Bude například OUTER UNION
nutné ji přeložit na ekvivalentní kombinaci projekcí a sjednocení.
Vzhledem k různým zpracováním hodnot NULL se spojení U-SQL vždy shoduje s řádkem, pokud oba sloupce porovnávané obsahují hodnotu NULL, zatímco spojení ve Sparku nebude odpovídat těmto sloupcům, pokud nejsou přidány explicitní kontroly null.
Transformace dalších konceptů U-SQL
U-SQL také nabízí různé další funkce a koncepty, jako jsou federované dotazy na databáze SQL Serveru, parametry, skalární a proměnné výrazů lambda, systémové proměnné, OPTION
rady.
Federované dotazy vůči databázím nebo externím tabulkám SQL Serveru
U-SQL poskytuje zdroj dat a externí tabulky a také přímé dotazy na Azure SQL Database. Spark sice nenabízí stejné abstrakce objektů, ale poskytuje konektor Sparku pro Azure SQL Database , který se dá použít k dotazování databází SQL.
Parametry a proměnné U-SQL
Parametry a uživatelské proměnné mají ekvivalentní koncepty ve Sparku a jejich hostitelských jazycích.
V jazyce Scala můžete například definovat proměnnou s klíčovým slovem var
:
var x = 2 * 3;
println(x)
Systémové proměnné U-SQL (proměnné začínající @@
) je možné rozdělit do dvou kategorií:
- Nastavitelné systémové proměnné, které lze nastavit na konkrétní hodnoty, aby ovlivnily chování skriptů
- Informační systémové proměnné, které inquire system and job level information
Většina nastavitelných systémových proměnných nemá ve Sparku žádný přímý ekvivalent. Některé z informačních systémových proměnných je možné modelovat předáním informací jako argumentů během provádění úlohy, jiné můžou mít ekvivalentní funkci v hostitelském jazyce Sparku.
Rady pro U-SQL
U-SQL nabízí několik syntaktických způsobů, jak poskytnout rady optimalizátoru dotazů a prováděcímu modulu:
- Nastavení systémové proměnné U-SQL
OPTION
klauzule přidružená k výrazu sady řádků za účelem poskytnutí nápovědy k datům nebo plánu- tip spojení v syntaxi výrazu join (například
BROADCASTLEFT
)
Optimalizátor dotazů založený na nákladech sparku má své vlastní funkce, které poskytují rady a vylaďují výkon dotazů. Projděte si odpovídající dokumentaci.
Další kroky
- Principy datových formátů Sparku pro vývojáře U-SQL
- .NET pro Apache Spark
- Upgrade řešení pro analýzu velkých objemů dat z Azure Data Lake Storage Gen1 na Azure Data Lake Storage Gen2
- Transformace dat pomocí aktivity Sparku ve službě Azure Data Factory
- Transformace dat pomocí aktivity Hadoop Hive ve službě Azure Data Factory
- Co je Apache Spark v Azure HDInsight