Преобразование данных с помощью преобразований потока данных
Внимание
Предварительная версия операций Интернета вещей Azure, включенная Azure Arc в настоящее время в предварительной версии. Не следует использовать это программное обеспечение предварительной версии в рабочих средах.
Вам потребуется развернуть новую установку Операций Интернета вещей Azure, когда общедоступная версия станет доступной. Вы не сможете обновить предварительную установку.
Юридические условия, применимые к функциям Azure, которые находятся в бета-версии, предварительной версии или в противном случае еще не выпущены в общедоступную версию, см . в дополнительных условиях использования для предварительных версий Microsoft Azure.
Преобразования потоков данных можно использовать для преобразования данных в операциях Интернета вещей Azure. Элемент преобразования в потоке данных используется для вычисления значений для выходных полей. Можно использовать входные поля, доступные операции, типы данных и преобразования типов в преобразованиях потока данных.
Элемент преобразования потока данных используется для вычисления значений для выходных полей:
inputs: [
'*.Max' // - $1
'*.Min' // - $2
]
output: 'ColorProperties.*'
expression: '($1 + $2) / 2'
Существует несколько аспектов, которые необходимо понять о преобразованиях:
- Ссылка на поля ввода: как ссылаться на значения из входных полей в формуле преобразования.
- Доступные операции: операции, которые можно использовать в преобразованиях. Например, добавление, вычитание, умножение и деление.
- Типы данных: типы данных, которые формула может обрабатывать и управлять ими. Например, целое число, плавающая точка и строка.
- Преобразования типов: преобразование типов данных между значениями поля ввода, вычислением формулы и полями выходных данных.
Поля ввода
В преобразованиях формулы могут работать со статическими значениями, такими как число, например 25 или параметры, производные от входных полей. Сопоставление определяет эти поля ввода, к которым может получить доступ формула. Каждое поле ссылается в соответствии с его порядком в списке входных данных:
inputs: [
'*.Max' // - $1
'*.Min' // - $2
'*.Mid.Avg' // - $3
'*.Mid.Mean' // - $4
]
output: 'ColorProperties.*'
expression: '($1, $2, $3, $4)'
В этом примере преобразование приводит к массиву, содержаму значения [Max, Min, Mid.Avg, Mid.Mean]
. Примечания в файле YAML (# - $1
, # - $2
) являются необязательными, но они помогают уточнить связь между каждым свойством поля и ее ролью в формуле преобразования.
Типы данных
Различные форматы сериализации поддерживают различные типы данных. Например, JSON предлагает несколько примитивных типов: string, number, boolean и null. Также включены массивы этих примитивных типов. В отличие от этого, другие форматы сериализации, такие как Avro, имеют более сложную систему типов, включая целые числа с несколькими битовыми длинами полей и метками времени с различными разрешениями. Примерами являются миллисекунда и микросекунды.
Когда приложение mapper считывает входное свойство, оно преобразует его во внутренний тип. Это преобразование необходимо для хранения данных в памяти, пока не будет записано в выходное поле. Преобразование в внутренний тип происходит независимо от того, совпадают ли форматы сериализации входных и выходных данных.
Внутреннее представление использует следующие типы данных:
Тип | Описание |
---|---|
bool |
Логическое значение true/false. |
integer |
Хранится как 128-разрядное целое число со знаком. |
float |
Хранится как 64-разрядное число с плавающей запятой. |
string |
Строка UTF-8. |
bytes |
Двоичные данные— строка 8-разрядных значений без знака. |
datetime |
UTC или локальное время с разрешением nanosecond. |
time |
Время дня с разрешением nanosecond. |
duration |
Длительность с разрешением nanosecond. |
array |
Массив всех типов, перечисленных ранее. |
map |
Вектор пар (ключ, значение) любых типов, перечисленных ранее. |
Поля входной записи
При чтении поля входной записи его базовый тип преобразуется в один из этих вариантов внутреннего типа. Внутреннее представление достаточно универсально, чтобы обрабатывать большинство типов входных данных с минимальным или без преобразования. Однако для некоторых типов входных данных требуется преобразование или не поддерживается. Некоторые примеры:
- Тип Avro
UUID
: он преобразуется в тип,string
так как в внутреннем представлении нет определенногоUUID
типа. - Тип Avro
decimal
: он не поддерживается приложением mapper, поэтому поля этого типа не могут быть включены в сопоставления. - Тип Avro
duration
: преобразование может отличаться.months
Если задано поле, оно не поддерживается. Если задано толькоdays
иmilliseconds
задано, он преобразуется во внутреннееduration
представление.
Для некоторых форматов используются суррогатные типы. Например, JSON не имеет datetime
типа и вместо этого сохраняет datetime
значения в виде строк, отформатированных в соответствии с ISO8601. Когда приложение карты считывает такое поле, внутреннее представление остается строкой.
Поля выходных записей
Приложение mapper предназначено для гибкого преобразования внутренних типов в типы выходных данных для размещения сценариев, в которых данные приходят из формата сериализации с ограниченной системой типов. В следующих примерах показано, как обрабатываются преобразования:
- Числовые типы: эти типы можно преобразовать в другие представления, даже если это означает потерю точности. Например, 64-разрядное число с плавающей запятой (
f64
) можно преобразовать в 32-разрядное целое число (i32
). - Строки к числам: если входящая запись содержит строку, например
123
, и выходное поле является 32-разрядным целым числом, средство сопоставления преобразует и записывает значение в виде числа. - Строки к другим типам:
- Если поле выходных данных имеет значение
datetime
, приложение mapper пытается проанализировать строку как ISO8601 отформатированнуюdatetime
. - Если поле выходных данных равно
binary/bytes
, средство сопоставления пытается десериализировать строку из строки в кодировке Base64.
- Если поле выходных данных имеет значение
- Логические значения:
- Преобразуется
0
/1
в значение, если выходное поле является числовым. - Преобразуется
true
/false
в значение, если выходное поле является строкой.
- Преобразуется
Явные преобразования типов
Хотя автоматическое преобразование работает так, как вы можете ожидать на основе распространенных методик реализации, существуют экземпляры, в которых правильное преобразование не может быть определено автоматически и приводит к неподдерживаемой ошибке. Для решения этих ситуаций несколько функций преобразования доступны для явного определения способа преобразования данных. Эти функции обеспечивают больший контроль над преобразованием данных и обеспечение целостности данных даже при нехватке автоматических методов.
Использование формулы преобразования с типами
В сопоставлениях необязательная формула может указать способ обработки данных из входных данных перед записью в поле вывода. Если формула не указана, средство сопоставления копирует поле ввода в выходные данные с помощью правил внутреннего типа и преобразования.
Если указана формула, типы данных, доступные для использования в формулах, ограничены:
- Целые числа
- Числа с плавающей запятой
- Строки
- Логические значения
- Массивы предыдущих типов
- Отсутствующее значение
Map
и byte
не может участвовать в формулах.
Типы, связанные с временем (datetime
, time
и duration
) преобразуются в целые значения, представляющие время в секундах. После вычисления формул результаты хранятся во внутреннем представлении и не преобразуются обратно. Например, datetime
преобразованное в секунды, остается целым числом. Если значение будет использоваться в datetime
полях, необходимо применить явный метод преобразования. Пример преобразует значение в строку ISO8601, которая автоматически преобразуется в datetime
тип выходного формата сериализации.
Использование нерегулярных типов
Особые рекомендации применяются к типам, таким как массивы и отсутствующие значения.
Массивы
Массивы можно обрабатывать с помощью функций агрегирования для вычисления одного значения из нескольких элементов. Например, с помощью входной записи:
{
"Measurements": [2.34, 12.3, 32.4]
}
Сопоставление:
inputs: [
'Measurements' // - $1
]
output: 'Measurement'
expression: 'min($1)'
Эта конфигурация выбирает наименьшее значение из массива Measurements
для поля вывода.
Также можно использовать функции, которые приводят к созданию нового массива:
inputs: [
'Measurements' // - $1
]
output: 'Measurements'
expression: 'take($1, 10)' // taking at max 10 items
Массивы также можно создать из нескольких отдельных значений:
inputs: [
'minimum' // - - $1
'maximum' // - - $2
'average' // - - $3
'mean' // - - $4
]
output: 'stats'
expression: '($1, $2, $3, $4)'
Это сопоставление создает массив, содержащий минимальный, максимальный, средний и средний.
Отсутствующее значение
Отсутствующее значение — это специальный тип, используемый в сценариях, например:
- Обработка отсутствующих полей во входных данных путем предоставления альтернативного значения.
- Условное удаление поля на основе его присутствия.
Пример сопоставления, использующего отсутствующее значение:
{
"Employment": {
"Position": "Analyst",
"BaseSalary": 75000,
"WorkingHours": "Regular"
}
}
Входная запись содержит BaseSalary
поле, но, возможно, это необязательно. Предположим, что если поле отсутствует, необходимо добавить значение из набора данных контекстуализации:
{
"Position": "Analyst",
"BaseSalary": 70000,
"WorkingHours": "Regular"
}
Сопоставление может проверить, присутствует ли поле во входной записи. Если поле найдено, выходные данные получают это существующее значение. В противном случае выходные данные получают значение из набора данных контекста. Например:
inputs: [
'BaseSalary' // - - - - - - - - - - - $1
'$context(position).BaseSalary' // - $2
]
output: 'BaseSalary'
expression: 'if($1 == (), $2, $1)'
Использует conversion
функцию if
, которая имеет три параметра:
- Первый параметр является условием. В этом примере проверяется, является ли
BaseSalary
поле входного поля (псевдонимом как$1
) отсутствующим значением. - Второй параметр является результатом функции, если условие в первом параметре имеет значение true. В этом примере это
BaseSalary
поле набора данных контекстуализации (псевдоним как$2
). - Третий параметр — это значение условия, если первый параметр имеет значение false.
Доступные функции
Функции можно использовать в формуле преобразования для выполнения различных операций:
min
Выбор одного элемента из массиваif
выбор между значениями- Обработка строк (например,
uppercase()
) - Явное преобразование (например,
ISO8601_datetime
) - Агрегирование (например,
avg()
)
Доступные операции
Потоки данных предлагают широкий спектр встроенных функций преобразования, которые позволяют пользователям легко выполнять преобразования единиц без необходимости сложных вычислений. Эти предопределенные функции охватывают распространенные преобразования, такие как температура, давление, длина, вес и объем. В следующем списке показаны доступные функции преобразования, а также соответствующие формулы и имена функций:
Преобразование | Формула | Имя функции |
---|---|---|
Цельсия к Фаренхейту | F = (C * 9/5) + 32 | cToF |
PSI для линейчатой строки | Bar = PSI * 0.0689476 | psiToBar |
Дюйм к см | Cm = дюйм * 2,54 | inToCm |
Футовый метр | Метр = фут * 0,3048 | ftToM |
Lbs to kg | Кг = lbs * 0,453592 | lbToKg |
Галлоны к литрам | Литровые = галлоны * 3,78541 | galToL |
Помимо этих однонаправленных преобразований, мы также поддерживаем обратные вычисления:
Преобразование | Формула | Имя функции |
---|---|---|
Фаренхейт к Цельсию | C = (F - 32) * 5/9 | fToC |
Линейчатая строка в PSI | PSI = бар / 0,0689476 | barToPsi |
Cm to inch | Дюйм = cm / 2,54 | cmToIn |
Метр на ногу | Фут = метр / 0,3048 | mToFt |
Кг к фунтам | Lbs = кг / 0,453592 | kgToLb |
Литровые галлоны | Gallons = литров / 3,78541 | lToGal |
Эти функции предназначены для упрощения процесса преобразования. Они позволяют пользователям вводить значения в одной единице и получать соответствующее значение в другом уроке без усилий.
Мы также предоставляем функцию масштабирования для масштабирования диапазона значений до определяемого пользователем диапазона. Например scale($1,0,10,0,100)
, входное значение масштабируется от диапазона от 0 до 10 до диапазона 0 до 100.
Кроме того, пользователи могут определять собственные функции преобразования с помощью простых математических формул. Наша система поддерживает основные операторы, такие как добавление (+
), вычитание (-
), умножение (*
) и деление (/
). Эти операторы соответствуют стандартным правилам приоритета. Например, умножение и деление выполняются перед добавлением и вычитанием. Приоритет можно настроить с помощью круглых скобок, чтобы обеспечить правильный порядок операций. Эта возможность позволяет пользователям настраивать их преобразования единиц в соответствии с конкретными потребностями или предпочтениями, повышая общую служебную программу и универсальность системы.
Для более сложных вычислений также доступны такие функции, как sqrt
(который находит квадратный корень числа).
Доступные арифметические, сравнения и логические операторы, сгруппированные по приоритету
Operator | Description |
---|---|
^ | Экспонентация: $1 ^ 3 |
Так как Exponentiation
имеет самый высокий приоритет, он выполняется сначала, если скобки не переопределяют этот порядок:
$1 * 2 ^ 3
интерпретируется как$1 * 8
потому, что2 ^ 3
часть выполняется сначала перед умножением.($1 * 2) ^ 3
обрабатывает умножение перед экспонентацией.
Operator | Description |
---|---|
- | Отрицание |
! | Логическое НЕ |
Negation
и Logical not
имеют высокий приоритет, поэтому они всегда придерживаться их непосредственного соседа, за исключением случаев, когда экспонентация участвует:
-$1 * 2
сначала отрицает$1
, а затем умножает.-($1 * 2)
умножается, а затем отрицает результат.
Operator | Description |
---|---|
* | Умножение: $1 * 10 |
/ | Деление: $1/25 (результат является целым числом, если оба аргумента являются целыми числами, в противном случае плавать) |
% | Модуло: $1 % 25 |
Multiplication
, и Modulo
,Division
с одинаковым приоритетом, выполняются слева направо, если заказ не изменяется скобками.
Operator | Description |
---|---|
+ | Добавление числовых значений, объединение строк |
- | Вычитание |
Addition
и Subtraction
считаются более слабыми по сравнению с операциями в предыдущей группе:
$1 + 2 * 3
приводит к$1 + 6
выполнению в первую очередь из-за2 * 3
более высокого приоритетаmultiplication
.($1 + 2) * 3
приоритетыAddition
передMultiplication
.
Operator | Description |
---|---|
< | Меньше |
> | Больше |
<= | Меньше или равно |
>= | Больше или равно |
== | Равно |
!= | Не равно |
Comparisons
работают с числовыми, логическими и строковыми значениями. Поскольку они имеют более низкий приоритет, чем арифметические операторы, для эффективного сравнения результатов не требуется:
$1 * 2 <= $2
эквивалентна($1 * 2) <= $2
.
Operator | Description |
---|---|
|| | Логическое ИЛИ |
&& | Логическое И |
Логические операторы используются для цепочки условий:
$1 > 100 && $2 > 200