Поделиться через


Преобразование данных с помощью преобразований потока данных

Внимание

На этой странице содержатся инструкции по управлению компонентами Операций Интернета вещей Azure с помощью манифестов развертывания Kubernetes, которые доступны в предварительной версии. Эта функция предоставляется с несколькими ограничениями и не должна использоваться для рабочих нагрузок.

Юридические условия, применимые к функциям 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. Он также включает массивы этих примитивных типов.

Когда приложение mapper считывает входное свойство, оно преобразует его во внутренний тип. Это преобразование необходимо для хранения данных в памяти, пока не будет записано в выходное поле. Преобразование в внутренний тип происходит независимо от того, совпадают ли форматы сериализации входных и выходных данных.

Внутреннее представление использует следующие типы данных:

Тип Описание
bool Логическое значение true/false.
integer Хранится как 128-разрядное целое число со знаком.
float Хранится как 64-разрядное число с плавающей запятой.
string Строка UTF-8.
bytes Двоичные данные— строка 8-разрядных значений без знака.
datetime UTC или локальное время с разрешением nanosecond.
time Время дня с разрешением nanosecond.
duration Длительность с разрешением nanosecond.
array Массив всех типов, перечисленных ранее.
map Вектор пар (ключ, значение) любых типов, перечисленных ранее.

Поля входной записи

При чтении поля входной записи его базовый тип преобразуется в один из этих вариантов внутреннего типа. Внутреннее представление достаточно универсально, чтобы обрабатывать большинство типов входных данных с минимальным или без преобразования.

Для некоторых форматов используются суррогатные типы. Например, 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: [
  '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.

Доступные функции

Потоки данных предоставляют набор встроенных функций, которые можно использовать в формулах преобразования. Эти функции можно использовать для выполнения распространенных операций, таких как арифметическое, сравнение и строковое манипулирование. Доступные функции:

Function Description Примеры
min Возвращает минимальное значение из массива. min(2, 3, 1)возвращает 1минимальное значение из массива. min($1)$1
max Возвращает максимальное значение из массива. max(2, 3, 1)возвращает 3максимальное значение из массива. max($1)$1
if Возвращается между значениями на основе условия. if($1 > 10, 'High', 'Low')возвращает значение'High', 10если $1 больше , в противном случае'Low'
len Возвращает длину символов строки или количество элементов в кортеже. len("Azure")возвращает, len(1, 2, 3) возвращает 35len($1) количество элементов в массиве.$1
floor Возвращает наибольшее целое число меньше или равно числу. floor(2.9) возвращает 2
round Верните ближайшее целое число к числу, округляя полупутные случаи от 0,0. round(2.5) возвращает 3
ceil Возвращает наименьшее целое число, большее или равное числу. ceil(2.1) возвращает 3
scale Масштабирование значения от одного диапазона до другого. scale($1, 0, 10, 0, 100) Масштабирует входное значение от диапазона от 0 до 10 до диапазона 0 до 100

Функции преобразования

Потоки данных предоставляют несколько встроенных функций преобразования для распространенных преобразований единиц, таких как температура, давление, длина, вес и объем. Далее приводятся некоторые примеры.

Преобразование Формула Имя функции
Цельсия к Фаренхейту 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

Кроме того, можно определить собственные функции преобразования с помощью базовых математических формул. Система поддерживает такие операторы, как добавление (), вычитание (+-), умножение (*) и деление (/). Эти операторы соответствуют стандартным правилам приоритета, которые можно настроить с помощью круглых скобок, чтобы обеспечить правильный порядок операций. Это позволяет настраивать преобразования единиц в соответствии с конкретными потребностями.

Доступные операторы по приоритету

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