다음을 통해 공유


데이터 흐름 변환을 사용하여 데이터 변환

Important

Azure Arc에서 사용하도록 설정된 Azure IoT Operations 미리 보기는 현재 미리 보기로 제공됩니다. 프로덕션 환경에서는 이 미리 보기 소프트웨어를 사용하면 안 됩니다.

일반적으로 사용 가능한 릴리스를 사용할 수 있게 되면 새 Azure IoT Operations 설치를 배포해야 합니다. 미리 보기 설치를 업그레이드할 수 없습니다.

베타, 미리 보기로 제공되거나 아직 일반 공급으로 릴리스되지 않은 Azure 기능에 적용되는 약관은 Microsoft Azure 미리 보기에 대한 추가 사용 약관을 참조하세요.

데이터 흐름 변환을 사용하여 Azure IoT 작업에서 데이터를 변환할 수 있습니다. 데이터 흐름의 변환 요소는 출력 필드의 값을 계산하는 데 사용됩니다. 데이터 흐름 변환에서는 입력 필드, 사용 가능한 작업, 데이터 형식 및 형식 변환을 사용할 수 있습니다.

데이터 흐름 변환 요소는 출력 필드의 값을 계산하는 데 사용됩니다.

- 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)의 주석은 선택 사항이지만 변환 수식에서 각 필드 속성과 해당 역할 간의 연결을 명확히 하는 데 도움이 됩니다.

데이터 형식

다양한 serialization 형식은 다양한 데이터 형식을 지원합니다. 예를 들어 JSON은 문자열, 숫자, 부울 및 null과 같은 몇 가지 기본 형식을 제공합니다. 이러한 기본 형식의 배열도 포함됩니다. 이와 대조적으로 Avro와 같은 다른 serialization 형식은 여러 비트 필드 길이를 갖는 정수와 다양한 해상도의 타임스탬프를 포함하는 더 복합 형식 시스템을 가지고 있습니다. 예를 들어 밀리초 및 마이크로초가 있습니다.

매퍼가 입력 속성을 읽으면 이를 내부 형식으로 변환합니다. 이러한 변환은 출력 필드에 쓰여질 때까지 데이터를 메모리에 보관하는 데 필요합니다. 입력 및 출력 serialization 형식이 동일한지 여부에 관계없이 내부 형식으로의 변환이 발생합니다.

내부 표현은 다음과 같은 데이터 형식을 사용합니다.

Type 설명
bool 논리적 true/false입니다.
integer 부가된 128비트 정수로 저장됩니다.
float 64비트 부동 소수점 숫자로 저장됩니다.
string UTF-8 문자열입니다.
bytes 부호 없는 8비트 값의 문자열인 이진 데이터입니다.
datetime 나노초 해상도를 사용하는 UTC 또는 현지 시간.
time 나노초 해상도의 하루 중 시간입니다.
duration 나노초 해상도의 기간입니다.
array 이전에 나열된 모든 형식의 배열입니다.
map 이전에 나열된 모든 형식의 (키, 값) 쌍의 벡터입니다.

입력 레코드 필드

입력 레코드 필드를 읽으면 기본 형식이 이러한 내부 형식 변형 중 하나로 변환됩니다. 내부 표현은 대부분의 입력 형식을 최소 변환 또는 전혀 변환 없이 처리할 수 있을 만큼 다양합니다. 그러나 일부 입력 형식은 변환이 필요하거나 지원되지 않습니다. 몇 가지 예:

  • Avro UUID 형식: 내부 표현에 string 특정 UUID 형식이 없기 때문에 변환됩니다.
  • Avro decimal 형식: 매퍼에서 지원되지 않으므로 이 형식의 필드를 매핑에 포함할 수 없습니다.
  • Avro duration 유형: 변환은 다를 수 있습니다. 필드가 months 설정되면 지원되지 않습니다. 설정만 days milliseconds 하면 내부 duration 표현으로 변환됩니다.

일부 형식의 경우 서로게이트 형식이 사용됩니다. 예를 들어 JSON에는 형식이 datetime 없으며 대신 ISO8601 따라 형식이 지정된 문자열로 값을 저장 datetime 합니다. 매퍼가 이러한 필드를 읽을 때, 내부 표현은 문자열로 유지됩니다.

출력 레코드 필드

매퍼는 제한된 형식 시스템을 갖춘 serialization 형식에서 데이터가 들어오는 시나리오를 수용하기 위해 내부 형식을 출력 형식으로 변환하여 유연하게 설계되었습니다. 다음 예제에서는 변환이 처리되는 방법을 보여 줍니다.

  • 숫자 형식: 정밀도가 손실되더라도 이러한 형식을 다른 표현으로 변환할 수 있습니다. 예를 들어 64비트 부동 소수점 숫자(f64)를 32비트 정수(i32)로 변환할 수 있습니다.
  • 문자열을 숫자로: 들어오는 레코드에 같은 123 문자열이 포함되어 있고 출력 필드가 32비트 정수인 경우 매퍼는 값을 변환하고 숫자로 씁니다.
  • 다른 형식에 대한 문자열:
    • 출력 필드인 경우 매퍼는 datetime문자열을 형식이 지정된 ISO8601 datetime구문 분석하려고 시도합니다.
    • 출력 필드인 경우 매퍼는 binary/bytesbase64로 인코딩된 문자열에서 문자열을 역직렬화하려고 합니다.
  • 부울 값:
    • 0/1 출력 필드가 숫자인 경우로 변환됩니다.
    • true/false 출력 필드가 문자열인 경우로 변환됩니다.

명시적 형식 변환

자동 변환은 일반적인 구현 사례에 따라 예상대로 작동하지만 올바른 변환을 자동으로 확인할 수 없고 지원되지 않는 오류가 발생하는 인스턴스가 있습니다. 이러한 상황을 해결하기 위해 데이터를 어떻게 변환해야 하는지 명시적으로 정의하는 여러 가지 변환 함수를 사용할 수 있습니다. 이러한 함수는 데이터를 변환하는 방법을 더 자세히 제어하고 자동 메서드가 부족한 경우에도 데이터 무결성을 유지하는 데 도움이 됩니다.

형식과 함께 변환 수식 사용

매핑에서 선택적 수식은 출력 필드에 쓰여지기 전에 입력 데이터가 어떻게 처리되는지 지정할 수 있습니다. 수식을 지정하지 않으면 매퍼는 내부 형식 및 변환 규칙을 사용하여 입력 필드를 출력에 복사합니다.

수식이 지정된 경우 수식에서 사용할 수 있는 데이터 형식은 다음과 같이 제한됩니다.

  • 정수
  • 부동 소수점 숫자
  • 문자열
  • 부울
  • 이전 형식의 배열
  • 누락된 값

Mapbyte 식에 참여할 수 없습니다.

시간(및time)과 duration관련된 형식은 시간(datetime초)을 나타내는 정수 값으로 변환됩니다. 수식 평가 후 결과는 내부 표현에 저장되며 다시 변환되지 않습니다. 예를 들어 datetime 초로 변환된 정수는 정수로 유지됩니다. 값이 필드에 사용되는 datetime 경우 명시적 변환 방법을 적용해야 합니다. 예를 들어 값을 출력 serialization 형식의 형식으로 자동으로 변환되는 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 함수를 사용합니다.

  • 첫 번째 매개 변수는 조건입니다. 이 예제에서는 입력 필드의 필드(별칭)$1가 누락된 값인지 BaseSalary 확인합니다.
  • 두 번째 매개 변수는 첫 번째 매개 변수의 조건이 true일 경우 함수의 결과입니다. 이 예에서는 컨텍스트화 데이터 세트의 BaseSalary 필드입니다(별칭 $2).
  • 세 번째 매개 변수는 첫 번째 매개 변수가 false일 경우의 조건 값입니다.

사용 가능한 함수

변환 수식에서 함수를 사용하여 다양한 작업을 수행할 수 있습니다.

  • min - 배열에서 단일 항목 선택
  • if - 값 사이에서 선택
  • 문자열 조작(예: uppercase())
  • 명시적 변환(예: ISO8601_datetime)
  • 집계(예: avg())

사용 가능한 작업

데이터 흐름은 사용자가 복잡한 계산 없이도 단위 변환을 쉽게 수행할 수 있는 다양한 기본 변환 함수를 제공합니다. 이러한 미리 정의된 함수는 온도, 압력, 길이, 무게, 부피와 같은 일반적인 변환을 다룹니다. 다음 목록에서는 해당 수식 및 함수 이름과 함께 사용 가능한 변환 함수를 보여 줍니다.

전환 수식 함수 이름
섭씨에서 화씨로 F = (C * 9/5) + 32 cToF
PSI에서 막대로 Bar = PSI * 0.0689476 psiToBar
인치에서 cm로 Cm = 인치 * 2.54 inToCm
발에서 미터로 미터 = foot * 0.3048 ftToM
Lbs to kg Kg = lbs * 0.453592 lbToKg
갤런에서 리터까지 Liters = 갤런 * 3.78541 galToL

이러한 단방향 변환 외에도 역방향 계산도 지원합니다.

전환 수식 함수 이름
화씨에서 섭씨로 C = (F - 32) * 5/9 fToC
Bar에서 PSI까지 PSI = bar / 0.0689476 barToPsi
Cm-인치 인치 = cm / 2.54 cmToIn
미터-발 Foot = meter / 0.3048 mToFt
Kg에서 파운드로 Lbs = kg / 0.453592 kgToLb
리터에서 갤런으로 갤런 = 리터 / 3.78541 lToGal

이러한 함수는 변환 프로세스를 간소화하도록 설계되었습니다. 사용자가 한 단위의 값을 입력하고 다른 단위에서 해당 값을 쉽게 받을 수 있습니다.

또한 값 범위를 사용자 정의 범위로 스케일링하는 크기 조정 함수도 제공합니다. 예제 scale($1,0,10,0,100)의 경우 입력 값은 0에서 10 범위에서 0에서 100 범위로 크기가 조정됩니다.

또한 사용자는 간단한 수학 수식을 사용하여 자신의 변환 함수를 유연하게 정의할 수 있습니다. 시스템은 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/)과 같은 기본 연산자를 지원합니다. 이러한 연산자는 표준 우선 순위 규칙을 따릅니다. 예를 들어, 곱하기 및 나누기 추가 및 빼기 전에 수행됩니다. 괄호를 사용하여 올바른 연산 순서를 확인하여 우선 순위를 조정할 수 있습니다. 이 기능을 사용하면 사용자는 특정 요구 사항이나 선호도에 맞게 단위 변환을 사용자 지정하여 시스템의 전반적인 유용성과 다양성을 향상시킬 수 있습니다.

더 복잡한 계산의 경우 숫자의 제곱근을 구하는 sqrt와 같은 함수도 사용할 수 있습니다.

우선 순위별로 그룹화된 사용 가능한 산술, 비교 및 부울 연산자

Operator 설명
^ 지수: $1 ^ 3

우선 순위가 가장 높기 때문에 Exponentiation 괄호가 이 순서를 재정의하지 않는 한 먼저 실행됩니다.

  • $1 * 2 ^ 3$1 * 8로 해석됩니다. 왜냐하면 곱셈 전에 2 ^ 3 부분이 먼저 실행되기 때문입니다.
  • ($1 * 2) ^ 3은 지수 연산 전에 곱셈을 처리합니다.
Operator 설명
- 부정
! 논리 NOT

NegationLogical not는 우선 순위가 높으므로 지수 연산이 관련된 경우를 제외하고는 항상 바로 옆에 붙습니다.

  • -$1 * 2 먼저 부정한 $1 다음 곱합니다.
  • -($1 * 2) 곱한 다음 결과를 부정합니다.
Operator 설명
* 곱하기: $1 * 10
/ 나누기: $1 / 25(두 인수가 모두 정수이면 결과는 정수이고, 그렇지 않으면 float입니다)
% 모듈로: $1 % 25

Multiplication, Division, Modulo는 동일한 우선 순위를 가지며 괄호로 순서를 변경하지 않는 한 왼쪽에서 오른쪽으로 실행됩니다.

Operator 설명
+ 숫자 값에 대한 추가, 문자열에 대한 연결
- 빼기

Addition 이전 Subtraction 그룹의 작업과 비교하여 약한 작업으로 간주됩니다.

  • $1 + 2 * 3$1 + 6 2 * 3 는 우선 순위가 높기 때문에 먼저 실행되기 때문에 입니다multiplication.
  • ($1 + 2) * 3 앞에 우선 순위를 지정합니다 Addition Multiplication.
Operator 설명
< 보다 작음
> 보다 큼
<= 작거나 같음
>= 크거나 같음
== 다음과 같음
!= 같지 않음

Comparisons 는 숫자, 부울 및 문자열 값에 대해 작동합니다. 산술 연산자보다 우선 순위가 낮기 때문에 결과를 효과적으로 비교하기 위해 괄호가 필요하지 않습니다.

  • $1 * 2 <= $2($1 * 2) <= $2와 같습니다.
Operator 설명
|| 논리적 OR
&& 논리적 AND

논리 연산자는 조건을 연결하는 데 사용됩니다.

  • $1 > 100 && $2 > 200