파서
파서는 특정 소스 메시지 클래스의 메시지가 특정 타겟 유형의 레코드로 파싱되고 변환되는 방식을 정의하는 구성 항목입니다.

파서 구성에는 다음 세 가지 구성요소가 있습니다.
- 소스 메시지 클래스 연결: 파서는 단일 소스 메시지 클래스의 소스 메시지를 처리합니다. 자세한 내용은 소스 메시지 클래스를 참고하세요.
- 유형 버전 연결: 파서는 단일 유형 버전의 프로토 레코드를 내보냅니다. 유형 버전 구성은 내보내진 프로토 레코드에 있어야 하는 필드를 정의하고 구조 (스키마)를 지정합니다. 자세한 내용은 유형을 참고하세요.
- Whistle 스크립트: Whistle 스크립트는 매핑, 파싱, 변환 로직을 사용하여 소스 메시지를 프로토 레코드로 변환하는 방법을 정의합니다. Whistle 스크립트는 사용자가 작성하지만 Manufacturing Data Engine (MDE)은 일반적인 사용 사례를 위한 구성 패키지를 제공합니다. 자세한 내용은 다음 섹션을 참고하세요.
Whistle 정의
Whistle은 한 스키마의 복잡한 중첩 데이터를 다른 스키마로 변환하는 데 사용할 수 있는 매핑 언어입니다. 제조업에서 데이터 모델은 복잡할 수 있으며 중첩되고 반복되는 구조가 많이 포함될 수 있습니다. 따라서 절차 형식으로 매핑 로직을 표현하기가 어렵습니다. Whistle은 매핑 및 변환 로직을 자연스러운 방식으로 정의할 수 있는 선언적 언어를 제공하여 이 문제를 해결합니다.
예를 들어 Whistle을 사용하여 여러 공장의 센서 데이터 모델을 통합 MDE 유형 모델로 조화시킬 수 있습니다. 소스 데이터에는 구성요소 목록이나 기능 계층 구조와 같은 중첩된 구조가 포함될 수 있습니다. Whistle을 사용하면 절차적 코드를 작성하지 않고도 이러한 중첩 구조의 매핑 로직을 자연스러운 방식으로 표현할 수 있습니다.
또한 Whistle은 반복되는 구조가 포함된 복잡한 매핑을 함수로 분류할 수 있는 함수를 지원합니다. 이렇게 하면 매핑 코드를 더 쉽게 이해하고 유지관리할 수 있으며 코드를 더 쉽게 재사용할 수도 있습니다.
Whistle은 절차적 접근 방식에 비해 이점이 있습니다. 아래 예시를 참조하세요.
다음 샘플 페이로드가 제공됩니다.
{
"payload": {
"tag": "vibration-sensor"
},
"details": {
"value": 0.24,
"timestamp": "2023-06-26 12:19:20.046000 UTC"
}
}
다음 Whistle 스크립트:
package mde
[{
tagName: $root.payload.tag
timestamps: {
eventTimestamp: $root.details.timestamp
}
data: {
numeric: $root.details.value
}
}]
이전 휘슬 스크립트를 적용하면 파서는 다음과 같은 프로토 레코드를 생성합니다.
[
{
"tagName": "vibration-sensor",
"timestamps": {
"eventTimestamp": "2023-06-26 12:19:20.046000 UTC"
},
"data": {
"value": 0.24
}
}
]
Whistle 언어 구문 및 사용 가능한 함수에 대한 자세한 내용은 Whistle 문서를 참고하세요.
파서의 런타임 동작
런타임에 파서는 연결된 소스 메시지 클래스의 모든 메시지를 수신하고, 각 메시지에 구성된 휘슬 스크립트를 적용하고, 구성된 유형의 하나 이상의 프로토 레코드를 내보냅니다.
내보낸 프로토 레코드는 유형 구성을 준수해야 합니다. 규정을 준수하지 않으면 데드 레터 큐로 이동합니다.
연관 규칙
파서는 단일 메시지 클래스 및 단일 유형 버전과만 연결될 수 있습니다. 하지만 파서는 파서가 연결된 버전 유형인 한 하나 이상의 레코드를 내보낼 수 있습니다. 파서의 출력은 프로토 레코드 객체의 배열입니다.

파서에서 레코드를 두 개 이상 내보내는 것은 소스 메시지에 집계 해제하려는 판독값 또는 이벤트 배열이 포함된 시나리오에서 유용합니다. 파서를 사용하면 소스 메시지를 여러 프로토 레코드로 '분할'하여 각 판독값이 BigQuery의 레코드 테이블에 있는 행이 되도록 할 수 있습니다.
내보내진 프로토 레코드는 태그 이름을 참조할 수 있습니다. 이 동작은 태그 이름이 유형으로 범위가 지정된 v1.1 및 v1.2와는 다릅니다. v1.3 이후에는 파서에서 내보낸 MDE 프로토 레코드가
Proto 레코드 스키마
proto 레코드가 준수해야 하는 JSON 스키마는 다음 사항에 따라 달라집니다.
- 원형: 유형과 연결된 특정 원형입니다.
- 유형 구성: 유형에 대해 정의된 구성 설정입니다.
원형은 레코드의 기본 스키마를 정의합니다. 예를 들어 discrete 원형 패밀리의 유형은 프로토 레코드에 다음 속성 값이 포함되어야 합니다.
tagNametimestamps.eventTimestampdata.complex
유형은 proto 레코드에 추가 제한을 적용할 수 있습니다. 예를 들어 data 필드의 스키마를 정의하거나 프로토 레코드에서 메타데이터 인스턴스를 참조하도록 요구할 수 있습니다.
자세한 내용은 프로토 레코드 참조를 확인하세요.
참조 데이터 조회
MDE는 제공된 키의 값을 조회 버킷에서 조회하는 맞춤 휘파람 함수를 제공합니다.
Whistle 스크립트에서 mde::lookupByKey 함수를 호출하여 자연 키로 조회 버킷 인스턴스를 조회할 수 있습니다. 이 함수는 인스턴스의 조회bucketName, bucketVersion, naturalKey를 인수로 사용하고 제공된 기본 키의 최신 메타데이터 인스턴스를 반환합니다. 이 인스턴스를 사용하여 파서의 프로토 레코드에 필드를 채울 수 있습니다. 예를 들면 다음과 같습니다.
"data" : {
"complex" : {
"VIN" : mde::lookupByKey("vin-lookup-bucket", input.vinKey, 1).VIN,
"vin_registration_time" : mde::lookupByKey("vin-lookup-bucket", input.vinKey, 1).vin_registration_time,
"ResultValue" : 163.0482614,
}
}
파서 이름 지정 제한사항
파서 이름에는 다음이 포함될 수 있습니다.
- 문자 (대문자 및 소문자), 숫자, 특수문자
-및_ - 최대 255자(영문 기준)까지 가능합니다.
검증에 다음 정규 표현식을 사용할 수 있습니다. ^[a-z][a-z0-9\\-_]{1,255}$
이름 지정 제한을 위반하는 항목을 만들려고 하면 400 error가 표시됩니다.
mde::sanitizeTagName() 함수를 사용하여 이름이 명명 제한을 준수하는지 확인할 수 있습니다. 자세한 내용은 Whistle MDE 기능을 참고하세요.