Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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, jak:
- Przekształć skrypty, w tym wyrażenia zestawów wierszy U-SQL
- Kod platformy .NET
- Typy danych
- Obiekty katalogu
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.
Framework Spark to skalowalna struktura oferująca powiązania z kilkoma językami, jak Scala, Java, Python, .NET i innymi, gdzie kod jest głównie pisany w jednym z tych języków. Tworzy się w niej abstrakcje danych nazywane odpornymi rozproszonymi zestawami danych (RDD), ramkami danych oraz zestawami danych, a następnie używa się języka specyficznego dla domeny, przypominającego LINQ, aby je przekształcić. Zapewnia również język SparkSQL jako deklaratywną nadbudowę działającą na abstrakcjach ramek danych i zbiorów danych. DSL udostępnia dwie kategorie operacji: transformacje i działania. 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
EXTRACTinstrukcji , 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ą zapisywane do plików przy użyciu instrukcji
OUTPUT, która określa lokalizacje oraz wbudowany lub zdefiniowany przez użytkownika moduł wyjścia, albo do tabeli U-SQL.
Skrypt jest oceniany leniwie, co oznacza, że każdy krok wyodrębniania i przekształcania jest składany w drzewo wyrażeń i globalnie oceniane (przepływ danych).
Programy platformy Spark działają w podobny sposób, gdy używasz łączników Spark do odczytywania danych i tworzenia ramek danych. Następnie stosujesz przekształcenia na ramkach danych, używając technologii DSL przypominającej LINQ lub SparkSQL. Na końcu zapisujesz wyniki w plikach, tymczasowych tabelach Spark, niektórych typach języków programowania lub na 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 teraz natywnie obsługują wykonywanie kodu .NET za pomocą .NET dla 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 U-SQL zdefiniowane przez użytkownika używają modelu U-SQL UDO, aby zapewnić skalowalne wykonywanie kodu operatora w rozproszeniu. W związku z tym UDO muszą zostać przepisane na funkcje zdefiniowane przez użytkownika, aby dopasować je 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 możliwości platformy .NET dla Apache Spark, musisz przekształcić swoje wyrażenia na równoważne wyrażenie, funkcję, agregator lub łącznik w języku Spark, Scala, Java lub Python.
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 wyrażeń C# w U-SQL typu skalarnego
Język wyrażeń U-SQL to C#. Wiele skalarnych, wbudowanych wyrażeń U-SQL jest natywnie implementowanych dla lepszej wydajności, podczas gdy bardziej złożone wyrażenia mogą być wykonywane poprzez 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ą inną semantykę typów niż środowiska uruchomieniowe JVM i Pythona oraz język 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 skalarne funkcji .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, aplikatory i kombinatory, które mogą być wdrażane w .NET (i — w pewnym stopniu — w Pythonie 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.
Odpowiednikiem wyodrębniaczy i modułów wyjściowych w Spark są łączniki 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 własnego łącznika. 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ć do SELECT różnych wywołań UDF, 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, oraz obsługę formatów JSON, XML, AVRO, a także niektóre możliwości 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, a dla niektórych typów zakresy typów, precyzja i/lub skala mogą się nieco różnić. 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 | 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
W Spark typy domyślnie dopuszczają wartości NULL, natomiast w U-SQL musisz jawnie oznaczać typy skalarne, inne niż obiektowe, jako dopuszczające wartości NULL. Platforma Spark pozwala zdefiniować kolumnę jako niedopuszczającą wartości null, ale nie będzie wymuszać tego 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, zwraca zero wierszy, nawet jeśli w column_name występują wartości NULL. Natomiast w U-SQL, zwracane są wiersze, w których column_name ma ustawioną wartość na null. Podobnie, instrukcja Spark SELECT, która używa WHERE column_name != NULL, zwraca zero wierszy, nawet jeśli w column_name występują wartości inne niż null, podczas gdy w języku U-SQL zwraca wiersze, które mają wartości inne niż null. W związku z tym, jeśli chcesz używać semantyki sprawdzania wartości null w U-SQL, należy odpowiednio użyć isnull i isnotnull (lub ich odpowiedników w 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, TVF-y, procedury składowane i zespoły, można modelować za pomocą funkcji i bibliotek kodu na platformie Spark oraz przywoływać przy użyciu funkcji w języku hosta i mechanizmów abstrakcji proceduralnej (na przykład poprzez importowanie modułów języka Python lub odwoływania się do funkcji w języku 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+FETCHINNER/OUTER/CROSS/SEMIJOINWyrażeniaCROSS/OUTERAPPLYWyrażeniaPIVOT/UNPIVOTWyrażeniaVALUESkonstruktor 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
-
OVERwyrażenia okienkowe - różne wbudowane agregatory i funkcje klasyfikacji (
SUMFIRSTitp.) - Niektóre z najbardziej znanych wyrażeń skalarnych SQL:
CASE,LIKE, (NOT)IN,AND, itp.OR.
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łć inne pojęcia U-SQL
Język U-SQL oferuje również inne funkcje i pojęcia, takie jak zapytania federacyjne względem baz danych programu SQL Server, parametry, zmienne skalarne i lambda, zmienne systemowe, OPTION podpowiedzi.
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 składniowych sposobów, aby dostarczyć wskazówki dla optymalizatora zapytań i mechanizmu wykonawczego:
- Ustawianie zmiennej systemowej U-SQL
- klauzula
OPTIONpowiązana z wyrażeniem zestawu wierszy w celu podania wskazówek odnośnie 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
- .NET dla platformy 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 w Hadoop w usłudze Azure Data Factory
- Co to jest Apache Spark w programie Azure HDInsight