다음을 통해 공유


Azure Stream Analytics에서 JavaScript 사용자 정의 함수

Azure Stream Analytics에서는 JavaScript로 작성된 사용자 정의 함수를 지원합니다. JavaScript에서 제공하는 풍부한 메서드 집합(String, RegExp, Math, Array, Date)을 통해 Stream Analytics 작업에서 복잡한 데이터 변환을 쉽게 만들 수 있게 되었습니다.

개요

JavaScript 사용자 정의 함수는 외부 연결이 필요 없는 상태 비저장, 컴퓨팅 전용 스칼라 함수를 지원합니다. 함수의 반환 값은 스칼라(단일) 값만 될 수 있습니다. JavaScript 사용자 정의 함수를 작업에 추가한 후 기본 제공 스칼라 함수처럼 쿼리의 아무 곳에서나 함수를 사용할 수 있습니다.

다음은 JavaScript 사용자 정의 함수가 유용할 수 있는 몇 가지 시나리오입니다.

  • 정규식 함수를 가진 문자열을 구문 분석 및 조작(예: Regexp_Replace()Regexp_Extract())
  • 데이터 디코딩 및 인코딩(예: 2진을 16진으로 변환)
  • JavaScript Math 함수를 사용하여 수학 계산을 수행
  • 정렬, 조인, 찾기 및 채우기 등의 배열 작업 수행

다음은 Stream Analytics에서 JavaScript 사용자 정의 함수로 수행할 수 없는 작업입니다.

  • 외부 REST 엔드포인트 호출(예: 역방향 IP 조회 수행 또는 외부 원본에서 참조 데이터 끌어오기)
  • 입력/출력에서 사용자 지정 이벤트 형식 직렬화 또는 역직렬화 수행
  • 사용자 지정 집계 만들기

Date.GetDate() 또는 Math.random()과 같은 함수는 함수 정의에서 차단되지는 않지만 사용하지 않는 것이 좋습니다. 이러한 함수는 호출할 때마다 다른 결과를 반환하며 Azure Stream Analytics 서비스에서 함수 호출 및 반환된 결과 저널을 유지하지 않습니다. 동일한 이벤트에 대해 함수가 다른 결과를 반환하면 사용자 또는 Stream Analytics 서비스에서 작업을 다시 시작할 때 반복성이 보장되지 않습니다.

작업에 JavaScript 사용자 정의 함수 추가

참고 항목

이러한 단계는 클라우드에서 실행하도록 구성된 Stream Analytics 작업에서 작동합니다. Stream Analytics 작업을 Azure IoT Edge에서 실행되도록 구성한 경우, Visual Studio를 대신 사용하고 C#을 사용하여 사용자 정의 함수를 작성합니다.

Stream Analytics 작업에 JavaScript 사용자 정의 함수를 추가하려면 작업 토폴로지에서 함수를 선택합니다. 그런 다음, +추가 드롭다운 메뉴에서 JavaScript UDF를 선택합니다.

Add JavaScript UDF

그런 다음 속성을 제공하고 저장을 선택해야 합니다.

속성 설명
함수 별칭 쿼리에서 함수를 호출할 이름을 입력합니다.
출력 형식 JavaScript 사용자 정의 함수가 Stream Analytics 쿼리에 반환할 형식입니다.
함수 정의 쿼리에서 UDF가 호출될 때마다 실행될 JavaScript 함수 구현입니다.

JavaScript UDF 테스트 및 문제 해결

모든 브라우저에서 JavaScript UDF 논리를 테스트하고 디버깅할 수 있습니다. 이러한 사용자 정의 함수의 논리 디버깅 및 테스트는 현재 Stream Analytics 포털에서 지원되지 않습니다. 이 함수가 예상대로 작동하면 위에서 설명한 대로 Stream Analytics 작업에 추가한 다음, 쿼리에서 직접 호출할 수 있습니다. Stream Analytics Tools for Visual Studio를 사용하여 JavaScript UDF로 쿼리 논리를 테스트할 수 있습니다.

JavaScript 런타임 오류는 치명적인 것으로 간주되고 활동 로그를 통해 표시됩니다. Azure Portal에서 로그를 검색하려면 작업으로 이동하고 활동 로그를 선택합니다.

쿼리에서 JavaScript 사용자 정의 함수 호출

udf 접두사로 시작하는 함수 별칭을 사용하여 쿼리에서 JavaScript 함수를 쉽게 호출할 수 있습니다. 다음은 16진수 값을 Stream Analytics 쿼리에서 호출되는 정수로 변환하는 JavaScript UDF의 예입니다.

    SELECT
        time,
        UDF.hex2Int(offset) AS IntOffset
    INTO
        output
    FROM
        InputStream

지원되는 JavaScript 개체

Azure Stream Analytics JavaScript 사용자 정의 함수는 표준인 기본 제공 JavaScript 개체를 지원합니다. 이러한 개체의 목록은 전역 개체를 참조하세요.

Stream Analytics 및 JavaScript 형식 변환

Stream Analytics 쿼리 언어와 JavaScript가 지원하는 형식 간에는 차이가 있습니다. 이 테이블에는 둘 간의 변환 매핑 목록이 나열되어 있습니다.

Stream Analytics JavaScript
bigint Number(JavaScript에서는 정확히 최대 2^53의 정수만 표현할 수 있음)
DateTime Date(JavaScript에서는 밀리초만 지원)
double 숫자
nvarchar(MAX) 문자열
녹음 Object
Array 배열
NULL Null

다음은 JavaScript-Stream Analytics 변환입니다.

JavaScript Stream Analytics
숫자 Bigint(숫자를 반올림하여 long.MinValue와 long.MaxValue 사이에 있는 경우, 그렇지 않으면 double임)
날짜 DateTime
문자열 nvarchar(MAX)
Object 녹음
배열 배열
Null, Undefined NULL
기타 다른 형식(예: 함수 또는 오류) 지원되지 않음(런타임 오류 발생)

JavaScript 언어는 대/소문자를 구분하며 JavaScript 코드에서 개체 필드의 대/소문자는 들어오는 데이터의 필드 대/소문자와 일치해야 합니다. 호환성 수준이 1.0인 작업은 SQL SELECT 문의 필드를 소문자로 변환합니다. 호환성 수준 1.1 이상에서 SELECT 문의 필드에는 SQL 쿼리에 지정된 것과 동일한 대/소문자가 있습니다.

기타 JavaScript 사용자 정의 함수 패턴

중첩된 JSON을 출력에 작성

Stream Analytics 작업 출력을 입력으로 사용하는 후속 처리 단계가 있고 이것이 JSON 형식을 요구하는 경우 JSON 문자열을 출력에 작성할 수 있습니다. 다음 예에서는 JSON.stringify() 함수를 호출하여 입력의 모든 이름/값 쌍을 묶고 출력에 단일 문자열 값으로 작성합니다.

JavaScript 사용자 정의 함수 정의:

function main(x) {
return JSON.stringify(x);
}

샘플 쿼리:

SELECT
    DataString,
    DataValue,
    HexValue,
    UDF.jsonstringify(input) As InputEvent
INTO
    output
FROM
    input PARTITION BY PARTITIONID

처리할 JSON 개체에 문자열 캐스팅

JSON인 문자열 필드가 있고 JavaScript UDF에서 처리하기 위해 JSON 개체로 변환하려는 경우 JSON.parse() 함수를 사용하여 이후에 사용할 수 있는 JSON 개체를 만들 수 있습니다.

JavaScript 사용자 정의 함수 정의:

function main(x) {
var person = JSON.parse(x);  
return person.name;
}

샘플 쿼리:

SELECT
    UDF.getName(input) AS Name
INTO
    output
FROM
    input

오류 처리를 위해 try/catch 사용

Try/catch 블록은 JavaScript UDF에 전달되는 잘못된 형식의 입력 데이터 문제를 식별하는 데 도움이 될 수 있습니다.

JavaScript 사용자 정의 함수 정의:

function main(input, x) {
    var obj = null;

    try{
        obj = JSON.parse(x);
    }catch(error){
        throw input;
    }
    
    return obj.Value;
}

샘플 쿼리: 오류가 있는 경우 반환될 수 있도록 전체 레코드를 첫 번째 매개 변수로 전달합니다.

SELECT
    A.context.company AS Company,
    udf.getValue(A, A.context.value) as Value
INTO
    output
FROM
    input A

toLocaleString()

JavaScript의 toLocaleString 메서드를 사용하여 이 메서드가 호출된 날짜 시간 데이터를 나타내는 언어 관련 문자열을 반환할 수 있습니다. Azure Stream Analtyics는 시스템 타임스탬프로 UTC 날짜 시간만 허용하지만 이 메서드를 사용하여 시스템 타임스탬프를 다른 로캘 및 표준 시간대로 변환할 수 있습니다. 이 메서드는 Internet Explorer에서 사용할 수 있는 것과 동일한 구현 동작을 따릅니다.

JavaScript 사용자 정의 함수 정의:

function main(datetime){
    const options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
    return datetime.toLocaleDateString('de-DE', options);
}

샘플 쿼리: 날짜/시간을 입력 값으로 전달

SELECT
    udf.toLocaleString(input.datetime) as localeString
INTO
    output
FROM
    input

이 쿼리의 출력은 제공된 옵션이 있는 de-DE의 입력 날짜/시간입니다.

Samstag, 28. Dezember 2019

사용자 로깅

로깅 메커니즘을 사용하면 작업이 실행되는 동안 사용자 지정 정보를 캡처할 수 있습니다. 로그 데이터를 사용하여 사용자 지정 코드의 정확성을 실시간으로 디버깅하거나 평가할 수 있습니다. 이 메커니즘은 세 가지 다른 메서드를 통해 사용할 수 있습니다.

Console.Info()

Console.Info 메서드는 코드 실행 중 일반 정보를 로그하는 데 사용됩니다. 이 메서드는 계산을 중단하지 않고 데이터를 로그합니다. 로그된 메시지는 이벤트 수준 정보로 표시됩니다.

console.info('my info message');

Console.Warn()

Console.Warn 메서드는 올바르지 않거나 예상되지 않을 수 있지만 여전히 계산에 허용되는 데이터를 로그하는 데 사용됩니다. 이 메서드는 계산을 중단하지 않으며 메서드가 반환된 후 실행을 다시 시작합니다. 로그된 메시지는 이벤트 수준 경고로 표시됩니다.

console.warn('my warning message');

Console.Error() 및 Console.Log()

Console.Error 메서드는 코드를 계속 실행할 수 없는 오류 사례를 로그하는 데만 사용됩니다. 이 메서드는 입력 매개 변수로 제공된 오류 정보와 함께 예외를 발생시키고 작업 실행을 중지합니다. 로그된 오류 메시지는 이벤트 수준 오류로 표시됩니다.

console.error('my error message');

진단 로그를 통해 로그 메시지에 액세스할 수 있습니다.

atob() 및 btoa()

btoa() 메서드는 ASCII 문자열을 Base64로 인코딩하는 데 사용할 수 있습니다. 이는 일반적으로 이진 형식으로 데이터를 전송하기 위해 수행됩니다. atob() 메서드는 Base64로 인코딩된 데이터 문자열을 ASCII 문자열 형식으로 디코딩하는 데 사용할 수 있습니다.

var myAsciiString = 'ascii string';
var encodedString = btoa(myAsciiString);
var decodedString = atob(encodedString);

다음 단계