Omówienie kodu platformy Apache Spark dla deweloperów języka U-SQL

Ważne

Usługa Azure Data Lake Analytics wycofana 29 lutego 2024 r. Dowiedz się więcej z tego ogłoszenia.

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.

Omówienie paradygmatów języka U-SQL i platformy Spark i przetwarzania

Przed rozpoczęciem migracji skryptów U-SQL usługi Azure Data Lake Analytics do platformy Spark warto zapoznać się z ogólnymi założeniami języka i przetwarzania tych dwóch systemów.

Język U-SQL to deklaratywny język zapytań przypominający język SQL, który korzysta z modelu 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 tak zwanych 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., w których kod jest pisany głównie w jednym z tych języków, tworzenie abstrakcji danych nazywanych odpornymi rozproszonymi zestawami danych (RDD), ramkami danych i zestawami danych, a następnie przekształcanie ich za pomocą języka SPECYFICZNEgo dla domeny (DSL) przypominającego LINQ. Zapewnia również usługę SparkSQL jako deklaratywną podjęzyk w ramce danych i abstrakcjach zestawu danych. Rozszerzenie DSL udostępnia dwie kategorie operacji, przekształceń i akcji. Zastosowanie przekształceń do abstrakcji danych nie spowoduje wykonania przekształcenia, 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 albo wydrukowanie 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ą Azure Batch lub 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 Azure Synapse Spark, Azure Databricks i Azure HDInsight oferują platformę Spark w formie 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:

  1. 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 on reprezentowany jako zestaw wierszy.
  2. 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.
  3. Na koniec wynikowe zestawy wierszy są danymi wyjściowymi w plikach 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 oceniany w sposób leniwy, co oznacza, że każdy krok wyodrębniania i przekształcania składa się z drzewa wyrażeń i jest obliczany globalnie (przepływ danych).

Programy platformy Spark są podobne do tego, że łączniki platformy Spark służą do odczytywania danych i tworzenia ramek danych, a następnie stosowania przekształceń w ramkach danych przy użyciu technologii LINQ, takich jak DSL lub SparkSQL, a następnie zapisują wynik 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 przy użyciu funkcji zdefiniowanych przez użytkownika, operatorów zdefiniowanych przez użytkownika i agregatorów zdefiniowanych przez użytkownika.

Azure Synapse i Azure HDInsight Spark obsługują teraz natywnie wykonywanie kodu platformy .NET za pomocą platformy .NET dla platformy Apache Spark. Oznacza to, że potencjalnie można 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 .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 UDO języka U-SQL 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 języka 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żnym wyrażeniu Spark, Scala, Java lub Python, funkcji, agregatora lub łącznika.

W każdym razie, jeśli masz dużą liczbę 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ń języka C# w języku U-SQL

Język wyrażeń U-SQL to C#. Wiele wbudowanych wyrażeń 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 Framework.

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 uruchomieniowego platformy Spark.

Należy pamiętać, że środowiska .NET i C# mają różne semantyki 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 skalarnych platformy .NET 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ęzyku 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.

Odpowiednik platformy Spark dla ekstraktorów i modułów wyjściowych to łączniki platformy Spark. W przypadku wielu ekstraktorów U-SQL można 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 do 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 ze standardem .NET Standard 2.0.

Inne typy obiektów zdefiniowanych przez użytkownika języka U-SQL 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że zostać zamapowany na funkcję SELECT różnych wywołań funkcji zdefiniowanej przez użytkownika, spakowana 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ą języki 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, odpowiednio 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 języka U-SQL jest oparty na systemie typów platformy .NET, a platforma Spark ma własny system typów, którego dotyczy 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

W przypadku platformy Spark typy na wartość domyślną zezwalają na wartości NULL w języku U-SQL, jawnie oznaczasz wartości skalarne, inne niż obiekty 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 błędnego 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 a 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 taka sama.

W związku z tym instrukcja SparkSQL SELECT , która używa WHERE column_name = NULL zera wierszy, nawet jeśli w column_namejęzyku U-SQL istnieją wartości NULL, zwraca wiersze, w których column_name ustawiono wartość null. Podobnie instrukcja spark SELECT , która używa WHERE column_name != NULL zero wierszy, nawet jeśli w column_namejęzyku U-SQL istnieją wartości inne niż null, zwraca wiersze, które mają wartość inną niż null. W związku z tym, jeśli chcesz semantyka sprawdzania wartości null języka 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 wartości tabeli (TVFs), procedur składowanych, zestawów U-SQL, zewnętrznych źródeł danych itp.

Obiekty kodu U-SQL, takie jak widoki, pliki TVF, 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 przez importowanie modułów języka Python lub odwoływanie się do funkcji Języka Scala).

Jeśli wykaz U-SQL został użyty do udostępniania danych i obiektów kodu w projektach i zespołach, należy użyć równoważnych mechanizmów udostępniania (na przykład maven do udostępniania obiektów kodu).

Przekształcanie wyrażeń zestawu wierszy języka U-SQL i wyrażeń skalarnych opartych na języku SQL

Podstawowy język języka U-SQL przekształca zestawy wierszy i jest oparty na języku SQL. Poniżej znajduje się niewyczerpana lista najbardziej typowych wyrażeń zestawu wierszy oferowanych w języku U-SQL:

  • SELECT/FROM/WHERE/GROUP BY+Agregacje+HAVING/ORDER BY+FETCH

  • INNER/OUTER/CROSS/SEMIJOIN Wyrażenia

  • CROSS/OUTERAPPLY Wyrażenia

  • PIVOT/UNPIVOT Wyrażenia

  • VALUES konstruktor zestawu wierszy

  • Ustawianie 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 okien
  • różne wbudowane agregatory i funkcje klasyfikacji (SUMFIRSTitp.)
  • Niektóre z najbardziej znanych wyrażeń skalarnych SQL: CASE, , LIKE(NOT) IN, ANDitp 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łcanie innych pojęć dotyczących języka U-SQL

Język U-SQL oferuje również różne inne funkcje i koncepcje, takie jak zapytania federacyjne względem SQL Server baz danych, parametrów, zmiennych wyrażeń skalarnych i lambda, zmiennych systemowych, OPTION wskazówek.

Zapytania federacyjne względem SQL Server baz danych/tabel zewnętrznych

Język U-SQL udostępnia źródła 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 platformy Spark dla usługi Azure SQL Database, która 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 rozpoczynają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
  • Informacyjne zmienne systemowe, które pytają informacje o systemie i poziomie zadania

Większość zmiennych systemowych, które można ustawić, 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 dostarczyć wskazówek optymalizatorowi zapytań i aparatowi 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 dostroić wydajność zapytań. Zapoznaj się z odpowiednią dokumentacją.

Następne kroki