Основные сведения о коде Apache Spark для разработчиков U-SQL
Внимание
Azure Data Lake Analytics вышел из эксплуатации 29 февраля 2024 года. Дополнительные сведения см. в этом объявлении.
Для аналитики данных ваша организация может использовать Azure Synapse Analytics или Microsoft Fabric.
В этом разделе содержатся общие руководства по преобразованию скриптов U-SQL в Apache Spark.
- Он начинается со сравнения парадигм обработки двух языков
- Содержит советы о том, как:
Общие сведения о скриптах U-SQL, языке Spark и парадигмах обработки
Прежде чем приступить к миграции скриптов U-SQL Azure Data Lake Analytics в Spark, полезно понять общие языковые и обрабатывающие философии двух систем.
U-SQL — это похожий на SQL язык декларативных запросов, использующий парадигму потока данных и позволяющий легко внедрять и масштабировать пользовательский код, написанный на .NET (например, C#), Python и R. Пользовательские расширения могут реализовывать простые выражения или определяемые пользователем функции, но также могут предоставить пользователю возможность реализовывать так называемые пользовательские операторы для выполнения преобразований, извлечения и записи выходных данных на уровне наборов строк.
Spark — это платформа с горизонтальным увеличением масштаба, предлагающая несколько языковых привязок в Scala, Java, Python, .NET и т. д., где вы в основном пишете код на одном из этих языков, создаете абстракции данных, которые называются отказоустойчивыми распределенными наборами (RDD), кадрами и наборами данных, а затем используете LINQ-ориентированный язык DSL для их преобразования. Он также реализует SparkSQL в качестве декларативного подъязыка, реализующего абстракцию кадров данных и наборов данных. DSL предусматривает две категории операций, преобразований и действий. Применение преобразований к абстракции данных не будет выполнять преобразование, а вместо этого создает план выполнения, который будет отправлен для оценки с помощью действия (например, запись результата во временную таблицу или файл или печать результата).
Таким образом, при переводе скрипта U-SQL в программу Spark необходимо решить, какой язык вы хотите использовать, чтобы по крайней мере создать абстракцию кадра данных (которая в настоящее время является наиболее часто используемой абстракцией данных) и следует ли записывать декларативные преобразования потока данных с помощью DSL или SparkSQL. В некоторых более сложных случаях может потребоваться разделить скрипт U-SQL на последовательность Spark и другие шаги, реализованные с помощью пакетная служба Azure или Функции Azure.
Кроме того, Azure Data Lake Analytics предлагает U-SQL в бессерверной среде службы заданий, где ресурсы выделяются для каждого задания, в то время как Azure Synapse Spark, Azure Databricks и Azure HDInsight предлагают Spark в виде службы кластера или с так называемыми шаблонами пула Spark. При преобразовании приложения необходимо учитывать последствия создания, изменения размера, масштабирования и вывода из эксплуатации кластеров или пулов.
Преобразование скриптов U-SQL
Скрипты U-SQL соответствуют следующему шаблону обработки:
- Данные считываются из неструктурированных файлов с помощью инструкции
EXTRACT
, по указанию местоположения или спецификации набора файлов, встроенным или определяемым пользователем средством извлечения и желаемой схемы, либо из таблиц U-SQL (управляемых или внешних таблиц). Он представлен как набор строк. - Наборы строк преобразуются в ряд инструкций U-SQL, которые применяют выражения U-SQL к наборам строк и создают новые наборы строк.
- Наконец, результирующие наборы строк выводятся либо в файлы с помощью инструкции
OUTPUT
, по местоположению и встроенным или определяемым пользователем средством вывода, либо в таблицу U-SQL.
Сценарий выполняется в медленном режиме, то есть каждый шаг извлечения и преобразования состоит из дерева выражений и просчитывается глобально (потоком данных).
Программы Spark схожи тем, что используют соединители Spark для чтения и создания кадров данных, а затем применяются преобразования для кадров данных на языке DSL или SparkSQL, а после этого результаты записываются в файлы, временные таблицы Spark, некоторые типы языков программирования или выводятся на консоль.
Преобразование кода .NET
Язык выражений U-SQL — C# и предлагает различные способы масштабирования пользовательского кода .NET с помощью определяемых пользователем функций, определяемых пользователем операторов и определяемых пользователем агрегатов.
Azure Synapse и Azure HDInsight Spark теперь поддерживают выполнение кода .NET с помощью .NET для Apache Spark. Это означает, что вы можете повторно использовать некоторые или все пользовательские функции .NET с помощью Spark. Обратите внимание, что U-SQL использует платформа .NET Framework в то время как .NET для Apache Spark основан на .NET Core 3.1 или более поздней версии.
Определяемые пользователем операторы U-SQL используют модель U-SQL для горизонтального выполнения кода оператора. Таким образом, определяемые пользователем функции должны быть перезаписаны в определяемые пользователем функции, чтобы соответствовать модели выполнения Spark.
В настоящее время .NET для Apache Spark не поддерживает определяемые пользователем агрегаты. Таким образом, определяемые пользователем агрегаты U-SQL должны быть переведены в определяемые пользователем агрегаты Spark, написанные в Scala.
Если вы не хотите воспользоваться преимуществами возможностей .NET для Apache Spark, вам придется переписать выражения в эквивалентные выражения Spark, Scala, Java или Python expression, function, aggregator или соединитель.
В любом случае, если в скриптах U-SQL используется большой объем логики .NET, свяжитесь с нами через своего менеджера по работе с клиентами, чтобы получить дополнительные указания.
Следующие сведения относятся к различным случаям использования .NET и C# в скриптах U-SQL.
Преобразование встроенных скалярных выражений в языке U-SQL
Язык выражений U-SQL — C#. Многие скалярные встроенные выражения U-SQL реализуются изначально для повышения производительности, а более сложные выражения можно выполнять путем вызова платформы .NET.
Spark имеет собственный скалярный язык выражений (как часть DSL или SparkSQL) и позволяет вызывать определяемые пользователем функции, написанные для среды выполнения JVM, .NET или Python.
Если у вас есть скалярные выражения в U-SQL, сначала следует найти наиболее подходящее скалярное выражение Spark, чтобы получить большую производительность, а затем сопоставить другие выражения с определяемой пользователем функцией языка среды выполнения Spark.
Имейте в виду, что .NET и C# имеют семантику типов, чем среды выполнения JVM и Python и DSL Spark. Дополнительные сведения о различиях в системе типов см. ниже.
Преобразование определяемых пользователем скалярных функций .NET и определяемых пользователем агрегатов
U-SQL предусматривает способы вызова произвольных скалярных функций .NET и вызова определяемых пользователем агрегатов, написанных на платформе .NET.
Spark также предлагает поддержку определяемых пользователем функций и пользовательских агрегатов, написанных на большинстве языков размещения, которые можно вызывать из DSL и SparkSQL.
Как упоминалось выше, .NET для Apache Spark поддерживает определяемые пользователем функции, написанные в .NET, но не поддерживает определяемые пользователем агрегаты. Таким образом, для определяемых пользователем функций можно использовать .NET для Apache Spark, а определяемые пользователем агрегаты должны создаваться в Scala для Spark.
Преобразование определяемых пользователем операторов (UDO)
U-SQL предусматривает несколько категорий определяемых пользователем операторов (UDO), например средства извлечения, средства вывода, модули сжатия, процессоры, средства применения и средства объединения, которые могут быть написаны на .NET (и в некоторой степени — на Python и R).
Spark не предлагает ту же модель расширяемости для операторов, но имеет эквивалентные возможности для некоторых.
Аналогом средств извлечения и вывода являются соединители Spark. Для многих средств извлечения U-SQL можно найти эквивалентный соединитель в сообществе Spark. Для других пользователей потребуется написать настраиваемый соединитель. Если средство извлечения U-SQL является сложным и использует несколько библиотек .NET, то может оказаться предпочтительнее создать соединитель в Scala, использующий взаимодействие для вызова библиотеки .NET, которая выполняет фактическую обработку данных. В этом случае необходимо развернуть среду выполнения .NET Core в кластере Spark и убедиться, что указанные библиотеки .NET соответствуют .NET Standard 2.0.
Другие типы UDO в U-SQL придется переписать с использованием определяемых пользователем функций и агрегатов, а также семантически подходящих выражений для Spark DLS или SparkSQL. Например, обработчик можно сопоставить с функцией SELECT различных вызовов UDF, упакованной как функцию, которая принимает кадр данных в качестве аргумента и возвращает кадр данных.
Преобразование опциональных библиотек U-SQL
U-SQL предоставляет набор необязательных и демонстрационных библиотек, предлагающих поддержку Python, R, JSON, XML, AVRO и некоторые возможности служб ИИ Azure.
Spark предлагает собственные возможности интеграции Python и R, pySpark и SparkR, а также предусматривает соединители для чтения и записи JSON, XML и AVRO.
Если вам нужно преобразовать скрипт, ссылающийся на библиотеки служб искусственного интеллекта Azure, рекомендуется обратиться к нам через представителя учетной записи Майкрософт.
Преобразование типизированных значений
Так как система типов U-SQL основана на системе типов .NET, и Spark имеет собственную систему типов, которая влияет на привязку языка узла, необходимо убедиться, что типы, которые вы работаете, близки и для определенных типов, диапазоны типов, точность и (или) масштабирование могут немного отличаться. Более того, U-SQL и Spark по-разному трактуют значения null
.
Типы данных
В следующей таблице приведены эквиваленты типов в Spark, Scala и PySpark для заданных типов 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) |
Дополнительные сведения см. в разделе:
Обработка значений NULL
В Spark типы по умолчанию допускают значения NULL, тогда как в U-SQL нужно явным образом помечать скалярные необъектные типы как допускающие значения NULL. Хотя Spark позволяет определить столбец как не допускающий значения NULL, ограничение не будет применяться, и это может привести к неверному результату.
В Spark NULL указывает на то, что значение неизвестно. Значение NULL в Spark отлично от любого значения, включая само себя. В Spark при сравнении двух значений NULL либо значения NULL и какого-либо иного значения возвращается неизвестное значение, так как значение каждого из значений NULL неизвестно.
В U-SQL сравнение работает по-другому, в соответствии с семантикой C#, где null
отличается от любого значения, но равно самому себе.
Таким образом, инструкция SELECT
в SparkSQL, которая использует WHERE column_name = NULL
, не вернет ни одной строки, даже если в column_name
есть значения NULL, тогда как U-SQL вернет строки, где column_name
установлено в null
. Аналогичным образом, в Spark SELECT
инструкция, которая использует WHERE column_name != NULL
, не вернет ни одной строки, даже если в column_name
есть значения, отличные от NULL, тогда как U-SQL вернет строки, где есть значения, отличные от NULL. Таким образом, если требуется семантика проверки значений NULL в U-SQL, следует использовать isnull и isnotnull соответственно (или их эквивалент в DSL).
Преобразование объектов каталога U-SQL
Одно из основных различий заключается в том, что скрипты U-SQL могут использовать собственные объекты каталога, многие из которых не имеют прямого эквивалента Spark.
Spark обеспечивает поддержку концепций хранилища метаданных Hive, в основном баз данных, таблиц и представлений, поэтому вы можете сопоставить базы данных и схемы U-SQL с базами данных Hive и таблицы U-SQL с таблицами Spark (см . перемещение данных, хранящихся в таблицах U-SQL), но не поддерживает функции с табличным значением (TVFs), хранимые процедуры, сборки U-SQL, внешние источники данных и т. д.
Такие объекты кода U-SQL, как представления, возвращающие табличные значения, хранимые процедуры и сборки, можно моделировать с помощью функций кода и библиотек в Spark и ссылаться на них через функции языка размещения и механизмы абстракции процедур (например, путем импорта модулей Python или ссылок на функции Scala).
Если каталог U-SQL служит для совместного использования данных и объектов кода в проектах и командах, то необходимо использовать эквивалентные механизмы общего доступа (например, Maven для совместного использования объектов кода).
Преобразование выражений набора строк U-SQL и скалярных выражений на основе SQL
Базовый язык U-SQL преобразует наборы строк и основан на языке SQL. Ниже приведен неисчерпаемый список наиболее распространенных выражений набора строк, предлагаемых в U-SQL:
SELECT
/FROM
/WHERE
/GROUP BY
+Статистические выражения+HAVING
/ORDER BY
+FETCH
Выражения
INNER
/OUTER
/CROSS
/SEMI
JOIN
Выражения
CROSS
/OUTER
APPLY
Выражения
PIVOT
/UNPIVOT
Конструктор набора строк
VALUES
Выражения присваивания
UNION
/OUTER UNION
/INTERSECT
/EXCEPT
Кроме того, U-SQL предоставляет различные скалярные выражения на основе SQL, такие как
- оконные выражения
OVER
- различные встроенные агрегаты и функции ранжирования (
SUM
FIRST
и т. д.) - Некоторые из самых распространенных скалярных выражений SQL:
CASE
,LIKE
, (NOT
)IN
,AND
,OR
и т. д.
Для большинства из этих выражений Spark предлагает эквивалентные выражения в обеих DSL и в SparkSQL. Некоторые выражения, не поддерживаемые изначально в Spark, придется переписывать, используя сочетание собственных выражений Spark и семантически эквивалентных шаблонов. Например, необходимо OUTER UNION
переводить в эквивалентное сочетание проекций и объединений.
Из-за разной обработки значений NULL соединение U-SQL всегда будет соответствовать строке, если оба столбца, сравниваемые с значением NULL, в то время как соединение в Spark не будет соответствовать таким столбцам, если только явные проверки NULL не добавляются.
Преобразование других концепций U-SQL
U-SQL также предлагает различные другие функции и понятия, такие как федеративные запросы к базам данных SQL Server, параметрам, скалярным и лямбда-переменным, системным переменным, OPTION
указаниям.
Федеративные запросы к базам данных SQL Server и внешним таблицам
U-SQL поддерживает источник данных и внешние таблицы, а также прямые запросы к базе данных SQL Azure. Хотя Spark не предлагает те же абстракции объектов, он предоставляет соединитель Spark для База данных SQL Azure, которые можно использовать для запроса баз данных SQL.
Параметры и переменные U-SQL
Параметры и пользовательские переменные имеют эквивалентные концепции в Spark и языках размещения.
Например, в Scala можно определить переменную с помощью ключевого слова var
:
var x = 2 * 3;
println(x)
Системные переменные U-SQL (переменные, начинающиеся с @@
) можно разделить на две категории:
- настраиваемые системные переменные, для которых можно задать конкретные значения, влияющие на поведение скриптов;
- информационные системные переменные, которые запрашивают информацию на уровне системы и задания.
Большинство настраиваемых системных переменных не имеют прямого эквивалента в Spark. Некоторые информационные системные переменные могут быть смоделированы путем передачи информации в аргументах во время выполнения задания, другие могут иметь эквивалентную функцию на языке размещения Spark.
Указания U-SQL
U-SQL предусматривает несколько синтаксических способов предоставления указаний оптимизатору запросов и подсистеме выполнения.
- Установка системной переменной U-SQL
- Предложение
OPTION
, связанное с выражением набора строк для предоставления указания данных или плана - указание о соединении в синтаксисе выражения JOIN (например,
BROADCASTLEFT
)
Оптимизатор запросов Spark на основе стоимости обладает собственными возможностями для предоставления указаний и настройки производительности запросов. См. соответствующую документацию.
Следующие шаги
- Понимание форматов данных Spark для разработчиков U-SQL
- .NET для Apache Spark
- Обновление решений аналитики больших данных из Azure Data Lake Storage 1-го поколения до Azure Data Lake Storage 2-го поколения
- Преобразование данных с помощью действия Spark в Фабрика данных Azure
- Преобразование данных с помощью действия Hadoop Hive в Фабрика данных Azure
- Что такое Apache Spark в Azure HDInsight