Omówienie kodu platformy Apache Spark dla deweloperów języka U-SQL
Ważne
Usługa Azure Data Lake Analytics została wycofana 29 lutego 2024 r. Dowiedz się więcej z tym ogłoszeniem.
Na potrzeby analizy danych organizacja może używać usługi Azure Synapse Analytics lub Microsoft Fabric.
Ta sekcja zawiera ogólne wskazówki dotyczące przekształcania skryptów U-SQL na platformę Apache Spark.
- Zaczyna się od porównania dwóch paradygmatów przetwarzania języka
- Zawiera porady dotyczące wykonywania następujących instrukcji:
- Przekształcanie skryptów, w tym wyrażeń zestawu wierszy U-SQL
- Kod platformy .NET
- Typy danych
- Obiekty wykazu
Omówienie paradygmatów języka U-SQL i platformy Spark oraz przetwarzania
Przed rozpoczęciem migracji skryptów U-SQL usługi Azure Data Lake Analytics do platformy Spark warto zrozumieć ogólne założenia języka i przetwarzania tych dwóch systemów.
U-SQL to język zapytań deklaratywnych przypominający język SQL, który korzysta z paradygmatu przepływu danych i umożliwia łatwe osadzanie i skalowanie kodu użytkownika napisanego na platformie .NET (na przykład C#), Python i R. Rozszerzenia użytkownika mogą implementować proste wyrażenia lub funkcje zdefiniowane przez użytkownika, ale mogą również zapewnić użytkownikowi możliwość implementowania operatorów zdefiniowanych przez użytkownika, które implementują operatory niestandardowe do wykonywania przekształceń na poziomie zestawu wierszy, wyodrębniania i zapisywania danych wyjściowych.
Platforma Spark to struktura skalowana w poziomie oferująca kilka powiązań językowych w języku Scala, Java, Python, .NET itp., gdzie pisać kod głównie w jednym z tych języków, tworzyć abstrakcje danych nazywane odpornymi rozproszonymi zestawami danych (RDD), ramkami danych i zestawami danych, a następnie używać języka SPECYFICZNEgo dla domeny (DSL) przypominającego LINQ, aby je przekształcić. Zapewnia również język SparkSQL jako deklaratywny podjęzyczność ramki danych i zestawów danych. Rozszerzenie DSL udostępnia dwie kategorie operacji, przekształceń i akcji. Zastosowanie przekształceń do abstrakcji danych nie spowoduje wykonania transformacji, ale zamiast tego skompiluje plan wykonania, który zostanie przesłany do oceny za pomocą akcji (na przykład zapisanie wyniku w tymczasowej tabeli lub pliku lub wydrukowaniu wyniku).
W związku z tym podczas tłumaczenia skryptu U-SQL na program Spark należy zdecydować, którego języka chcesz użyć do co najmniej wygenerowania abstrakcji ramki danych (która jest obecnie najczęściej używaną abstrakcją danych) i czy chcesz napisać deklaratywne przekształcenia przepływu danych przy użyciu języka DSL lub SparkSQL. W niektórych bardziej złożonych przypadkach może być konieczne podzielenie skryptu U-SQL na sekwencję platformy Spark i inne kroki zaimplementowane za pomocą usługi Azure Batch lub usługi Azure Functions.
Ponadto usługa Azure Data Lake Analytics oferuje język U-SQL w bezserwerowym środowisku usługi zadań, w którym zasoby są przydzielane dla każdego zadania, podczas gdy usługi Azure Synapse Spark, Azure Databricks i Azure HDInsight oferują platformę Spark w postaci usługi klastra lub z tak zwanymi szablonami puli Spark. Podczas przekształcania aplikacji należy wziąć pod uwagę konsekwencje tworzenia, określania rozmiaru, skalowania i likwidowania klastrów lub pul.
Przekształcanie skryptów U-SQL
Skrypty U-SQL są zgodne z następującym wzorcem przetwarzania:
- Dane są odczytywane z plików bez struktury, przy użyciu
EXTRACT
instrukcji , specyfikacji lokalizacji lub zestawu plików oraz wbudowanej lub zdefiniowanej przez użytkownika funkcji wyodrębniania i żądanego schematu albo z tabel U-SQL (tabel zarządzanych lub zewnętrznych). Jest reprezentowana jako zestaw wierszy. - Zestawy wierszy są przekształcane w wielu instrukcjach U-SQL, które stosują wyrażenia U-SQL do zestawów wierszy i tworzą nowe zestawy wierszy.
- Na koniec wynikowe zestawy wierszy są danymi wyjściowymi do plików przy użyciu
OUTPUT
instrukcji , która określa lokalizacje i wbudowane lub zdefiniowane przez użytkownika moduł wyjściowy albo do tabeli U-SQL.
Skrypt jest obliczany leniwie, co oznacza, że każdy krok wyodrębniania i przekształcania składa się z drzewa wyrażeń i globalnie ocenianego (przepływu danych).
Programy platformy Spark są podobne do tego, że używa się łączników platformy Spark do odczytywania danych i tworzenia ramek danych, a następnie stosowania przekształceń na ramkach danych przy użyciu technologii DSL lub SparkSQL, a następnie zapisywania wyników w plikach, tymczasowych tabelach Spark, niektórych typach języka programowania lub konsoli.
Przekształcanie kodu platformy .NET
Język wyrażeń U-SQL to C# i oferuje różne sposoby skalowania niestandardowego kodu platformy .NET za pomocą funkcji zdefiniowanych przez użytkownika, operatorów zdefiniowanych przez użytkownika i agregatorów zdefiniowanych przez użytkownika.
Usługi Azure Synapse i Azure HDInsight Spark obsługują teraz natywnie wykonywanie kodu platformy .NET przy użyciu platformy .NET dla platformy Apache Spark. Oznacza to, że możesz potencjalnie ponownie użyć niektórych lub wszystkich funkcji zdefiniowanych przez użytkownika platformy .NET za pomocą platformy Spark. Należy jednak pamiętać, że język U-SQL używa programu .NET Framework, podczas gdy platforma .NET dla platformy Apache Spark jest oparta na platformie .NET Core 3.1 lub nowszej.
Operatory zdefiniowane przez użytkownika (U-SQL) używają modelu U-SQL UDO w celu zapewnienia skalowalnego w poziomie wykonywania kodu operatora. W związku z tym obiekty zdefiniowane przez użytkownika muszą zostać przepisane do funkcji zdefiniowanych przez użytkownika w celu dopasowania ich do modelu wykonywania platformy Spark.
Platforma .NET dla platformy Apache Spark obecnie nie obsługuje agregatorów zdefiniowanych przez użytkownika. W związku z tym agregatory zdefiniowane przez użytkownika U-SQL będą musiały zostać przetłumaczone na agregatory zdefiniowane przez użytkownika platformy Spark napisane w języku Scala.
Jeśli nie chcesz korzystać z funkcji platformy .NET dla platformy Apache Spark, musisz ponownie zapisać wyrażenia w równoważnej kodzie Spark, Scala, Java lub Python, funkcji, agregatora lub łącznika.
W każdym razie, jeśli masz dużą ilość logiki .NET w skryptach U-SQL, skontaktuj się z nami za pośrednictwem przedstawiciela konta Microsoft, aby uzyskać dalsze wskazówki.
Poniższe szczegóły dotyczą różnych przypadków użycia platformy .NET i języka C# w skryptach U-SQL.
Przekształcanie wbudowanych wyrażeń U-SQL języka C# w języku scalarnym
Język wyrażeń U-SQL to C#. Wiele wyrażeń wbudowanych U-SQL w tekście jest implementowanych natywnie w celu zwiększenia wydajności, podczas gdy bardziej złożone wyrażenia mogą być wykonywane przez wywołanie platformy .NET.
Platforma Spark ma własny język wyrażeń skalarnych (w ramach języka DSL lub SparkSQL) i umożliwia wywoływanie funkcji zdefiniowanych przez użytkownika napisanych dla środowiska uruchomieniowego JVM, .NET lub Python.
Jeśli masz wyrażenia skalarne w języku U-SQL, najpierw należy znaleźć najbardziej odpowiednie natywnie zrozumiałe wyrażenie skalarne platformy Spark, aby uzyskać największą wydajność, a następnie zamapować inne wyrażenia na funkcję zdefiniowaną przez użytkownika wybranego języka środowiska uruchomieniowego platformy Spark.
Należy pamiętać, że środowiska uruchomieniowe platformy .NET i języka C# mają różne semantyka typów niż środowiska uruchomieniowe JVM i Python oraz rozszerzenie DSL platformy Spark. Zobacz poniżej , aby uzyskać więcej informacji na temat różnic w systemie typów.
Przekształcanie zdefiniowanych przez użytkownika funkcji platformy .NET i agregatorów zdefiniowanych przez użytkownika
Język U-SQL udostępnia sposoby wywoływania dowolnych funkcji platformy .NET skalarnych oraz wywoływania agregatorów zdefiniowanych przez użytkownika napisanych na platformie .NET.
Platforma Spark oferuje również obsługę funkcji zdefiniowanych przez użytkownika i agregatorów zdefiniowanych przez użytkownika napisanych w większości języków hostingu, które mogą być wywoływane z języków DSL i SparkSQL platformy Spark.
Jak wspomniano powyżej, platforma .NET dla platformy Apache Spark obsługuje funkcje zdefiniowane przez użytkownika napisane na platformie .NET, ale nie obsługują agregatorów zdefiniowanych przez użytkownika. Dlatego w przypadku funkcji zdefiniowanych przez użytkownika można używać platformy .NET dla platformy Apache Spark, podczas gdy agregatory zdefiniowane przez użytkownika muszą być tworzone w języku Scala dla platformy Spark.
Przekształcanie operatorów zdefiniowanych przez użytkownika (UDO)
Język U-SQL udostępnia kilka kategorii operatorów zdefiniowanych przez użytkownika, takich jak wyodrębniacze, moduły wyjściowe, reduktory, procesory, appliery i kombinatory, które mogą być zapisywane na platformie .NET (i — w pewnym stopniu — w językach Python i R).
Platforma Spark nie oferuje tego samego modelu rozszerzalności dla operatorów, ale ma równoważne możliwości dla niektórych.
Spark odpowiednik wyodrębniaczy i modułów wyjściowych to łączniki platformy Spark. W przypadku wielu ekstraktorów U-SQL możesz znaleźć odpowiedni łącznik w społeczności platformy Spark. W przypadku innych będzie konieczne napisanie łącznika niestandardowego. Jeśli moduł wyodrębniania U-SQL jest złożony i korzysta z kilku bibliotek platformy .NET, lepszym rozwiązaniem może być utworzenie łącznika w języku Scala, który używa międzyoperacyjności w celu wywołania biblioteki .NET, która wykonuje rzeczywiste przetwarzanie danych. W takim przypadku należy wdrożyć środowisko uruchomieniowe platformy .NET Core w klastrze Spark i upewnić się, że przywoływalne biblioteki platformy .NET są zgodne z platformą .NET Standard 2.0.
Inne typy U-SQL UDOs muszą zostać przepisane przy użyciu funkcji zdefiniowanych przez użytkownika i agregatorów oraz semantycznie odpowiedniego wyrażenia Spark DLS lub SparkSQL. Na przykład procesor można zamapować na selektor różnych wywołań funkcji zdefiniowanej przez użytkownika, spakowany jako funkcja, która przyjmuje ramkę danych jako argument i zwraca ramkę danych.
Przekształcanie opcjonalnych bibliotek języka U-SQL
Język U-SQL udostępnia zestaw opcjonalnych i demonstracyjnych bibliotek, które oferują obsługę języków Python, R, JSON, XML, AVRO i niektóre funkcje usług Azure AI.
Platforma Spark oferuje własną integrację języków Python i R, pySpark i SparkR oraz udostępnia łączniki do odczytu i zapisu danych JSON, XML i AVRO.
Jeśli musisz przekształcić skrypt odwołujący się do bibliotek usług Azure AI, zalecamy skontaktowanie się z nami za pośrednictwem przedstawiciela konta Microsoft.
Przekształcanie wartości wpisanych
Ponieważ system typów U-SQL jest oparty na systemie typów platformy .NET, a platforma Spark ma własny system typów, który ma wpływ na powiązanie języka hosta, musisz upewnić się, że obsługiwane typy są bliskie i dla niektórych typów, zakresy typów, precyzja i/lub skala mogą być nieco inne. Ponadto język U-SQL i platforma Spark traktują null
wartości inaczej.
Typy danych
W poniższej tabeli przedstawiono równoważne typy platform Spark, Scala i PySpark dla danych typów U-SQL.
U-SQL | platforma 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) |
Aby uzyskać więcej informacji, zobacz:
Traktowanie wartości NULL
Na platformie Spark typy na wartość domyślną zezwalają na wartości NULL w języku U-SQL, jawnie oznaczasz wartości skalarne, inne niż obiekt jako dopuszczane do wartości null. Platforma Spark pozwala zdefiniować kolumnę jako niemożliwą do wartości null, ale nie będzie wymuszać ograniczenia i może prowadzić do nieprawidłowego wyniku.
Na platformie Spark wartość NULL wskazuje, że wartość jest nieznana. Wartość NULL platformy Spark różni się od dowolnej wartości, w tym samej. Porównania między dwiema wartościami NULL platformy Spark lub między wartością NULL i dowolną inną wartością zwracają wartość nieznaną, ponieważ wartość każdej wartości NULL jest nieznana.
To zachowanie różni się od języka U-SQL, który jest zgodny z semantykami języka C#, gdzie null
różni się od dowolnej wartości, ale jest równa samej sobie.
W związku z tym instrukcja SparkSQL SELECT
, która używa WHERE column_name = NULL
wartości zero, nawet jeśli w języku U-SQL istnieją wartości column_name
NULL, zwraca wiersze, w których column_name
ustawiono wartość null
. Podobnie instrukcja Spark SELECT
, która używa WHERE column_name != NULL
zerowych wierszy, nawet jeśli w column_name
języku U-SQL nie ma wartości null, zwraca wiersze, które mają wartość inną niż null. W związku z tym, jeśli chcesz semantyka sprawdzania wartości null U-SQL, należy użyć isull i isnotnull odpowiednio (lub ich odpowiednik DSL).
Przekształcanie obiektów wykazu U-SQL
Jedną z głównych różnic jest to, że skrypty U-SQL mogą korzystać z obiektów katalogu, z których wiele nie ma bezpośredniego odpowiednika platformy Spark.
Platforma Spark zapewnia obsługę pojęć związanych z magazynem metadanych Hive, głównie baz danych, tabel i widoków, dzięki czemu można mapować bazy danych I schematy U-SQL na bazy danych Hive oraz tabele U-SQL na tabele Platformy Spark (zobacz Przenoszenie danych przechowywanych w tabelach U-SQL), ale nie obsługuje funkcji tabel wartościowych (TVF), procedur składowanych, zestawów U-SQL, zewnętrznych źródeł danych itp.
Obiekty kodu U-SQL, takie jak widoki, pliki TVFs, procedury składowane i zestawy, można modelować za pomocą funkcji i bibliotek kodu na platformie Spark oraz przywoływane przy użyciu funkcji języka hosta i mechanizmów abstrakcji proceduralnych (na przykład za pomocą importowania modułów języka Python lub odwoływania się do funkcji Scala).
Jeśli wykaz U-SQL został użyty do udostępniania obiektów danych i kodu w projektach i zespołach, należy użyć równoważnych mechanizmów udostępniania (na przykład narzędzia Maven do udostępniania obiektów kodu).
Przekształcanie wyrażeń zestawu wierszy U-SQL i wyrażeń skalarnych opartych na języku SQL
Podstawowy język U-SQL przekształca zestawy wierszy i jest oparty na języku SQL. Poniżej znajduje się niewyczerpana lista najczęściej używanych wyrażeń zestawu wierszy oferowanych w języku U-SQL:
SELECT
/FROM
/WHERE
/GROUP BY
+Agregacje+HAVING
/ORDER BY
+FETCH
INNER
/OUTER
/CROSS
/SEMI
JOIN
WyrażeniaCROSS
/OUTER
APPLY
WyrażeniaPIVOT
/UNPIVOT
WyrażeniaVALUES
konstruktor zestawu wierszyUstawianie wyrażeń
UNION
/OUTER UNION
/INTERSECT
/EXCEPT
Ponadto język U-SQL udostępnia różne wyrażenia skalarne oparte na języku SQL, takie jak
OVER
wyrażenia okienne- różne wbudowane agregatory i funkcje klasyfikacji (
SUM
FIRST
itp.) - Niektóre z najbardziej znanych wyrażeń skalarnych SQL:
CASE
, ,LIKE
(NOT
)IN
,AND
itpOR
.
Platforma Spark oferuje wyrażenia równoważne zarówno w postaci DSL, jak i SparkSQL dla większości tych wyrażeń. Niektóre wyrażenia nieobsługiwane natywnie na platformie Spark będą musiały zostać przepisane przy użyciu kombinacji natywnych wyrażeń platformy Spark i semantycznie równoważnych wzorców. Na przykład OUTER UNION
należy przetłumaczyć je na równoważną kombinację projekcji i związków.
Ze względu na inną obsługę wartości NULL sprzężenie U-SQL będzie zawsze zgodne z wierszem, jeśli obie porównywane kolumny zawierają wartość NULL, podczas gdy sprzężenie na platformie Spark nie będzie zgodne z takimi kolumnami, chyba że zostaną dodane jawne kontrole wartości null.
Przekształcanie innych pojęć dotyczących języka U-SQL
Język U-SQL oferuje również różne inne funkcje i pojęcia, takie jak zapytania federacyjne względem baz danych programu SQL Server, parametrów, zmiennych skalarnych i lambda, zmiennych systemowych, OPTION
wskazówek.
Zapytania federacyjne względem baz danych/tabel zewnętrznych programu SQL Server
Język U-SQL udostępnia źródło danych i tabele zewnętrzne, a także bezpośrednie zapytania względem usługi Azure SQL Database. Platforma Spark nie oferuje tych samych abstrakcji obiektów, ale udostępnia łącznik Spark dla usługi Azure SQL Database , który może służyć do wykonywania zapytań dotyczących baz danych SQL.
Parametry i zmienne U-SQL
Parametry i zmienne użytkownika mają równoważne pojęcia w środowisku Spark i ich językach hostingu.
Na przykład w języku Scala można zdefiniować zmienną za pomocą słowa kluczowego var
:
var x = 2 * 3;
println(x)
Zmienne systemowe języka U-SQL (zmienne zaczynające się od @@
) można podzielić na dwie kategorie:
- Ustawiane zmienne systemowe, które można ustawić na określone wartości, aby wpływać na zachowanie skryptów
- Informacje o zmiennych systemowych, które pytają o informacje o systemie i poziomie zadania
Większość zmiennych systemowych do ustawiania nie ma bezpośredniego odpowiednika na platformie Spark. Niektóre informacyjne zmienne systemowe można modelować, przekazując informacje jako argumenty podczas wykonywania zadania, inne mogą mieć równoważną funkcję w języku hostingu platformy Spark.
Wskazówki dotyczące języka U-SQL
Język U-SQL oferuje kilka sposobów składniowych, aby zapewnić wskazówki dla optymalizatora zapytań i aparatu wykonywania:
- Ustawianie zmiennej systemowej U-SQL
- klauzula
OPTION
skojarzona z wyrażeniem zestawu wierszy w celu podania wskazówek dotyczących danych lub planu - wskazówka sprzężenia w składni wyrażenia sprzężenia (na przykład
BROADCASTLEFT
)
Optymalizator zapytań oparty na kosztach platformy Spark ma własne możliwości, aby zapewnić wskazówki i dostosować wydajność zapytań. Zapoznaj się z odpowiednią dokumentacją.
Następne kroki
- Omówienie formatów danych platformy Spark dla deweloperów U-SQL
- Platforma .NET for Apache Spark
- Uaktualnianie rozwiązań do analizy danych big data z usługi Azure Data Lake Storage Gen1 do usługi Azure Data Lake Storage Gen2
- Przekształcanie danych przy użyciu działania platformy Spark w usłudze Azure Data Factory
- Przekształcanie danych przy użyciu działania hive usługi Hadoop w usłudze Azure Data Factory
- Co to jest Apache Spark w programie Azure HDInsight