JSON 평면화, 이스케이프 및 배열 처리
메모
Time Series Insights 서비스는 2024년 7월 7일에 사용 중지됩니다. 가능한 한 빨리 기존 환경을 대체 솔루션으로 마이그레이션하는 것이 좋습니다. 더 많은 정보는 사용 중단 및 마이그레이션에 대한 설명서를참조하세요.
Azure Time Series Insights Gen2 환경은 특정 명명 규칙 집합에 따라 웜 및 콜드 저장소의 열을 자동으로 생성합니다. 이벤트를 수집하면 JSON 페이로드 및 속성 이름에 규칙 집합이 적용됩니다. 여기에는 특수 문자의 이스케이프 및 중첩된 JSON 객체의 단순화가 포함됩니다. JSON의 모양이 이벤트를 저장하고 쿼리하는 방법에 어떤 영향을 미치는지 이해할 수 있도록 이러한 규칙을 알고 있는 것이 중요합니다. 규칙의 전체 목록은 아래 표를 참조하세요. 예제 A & B에서는 배열에서 여러 시계열을 효율적으로 일괄 처리할 수 있는 방법도 보여 줍니다.
중요하다
-
시계열 ID 속성 및/또는 이벤트 원본 타임스탬프 속성(들)을 선택하기 전에 아래 규칙을 검토하십시오. TS ID나 타임스탬프가 중첩된 객체 내에 있거나 아래 언급한 특수 문자가 하나 이상 포함되어 있는 경우, 제공한 속성 이름이 수집 규칙이 적용된 후
열 이름과 일치하는지 확인해야 합니다. 아래 B 예제를 참조하세요.
규칙 | 예제 JSON | 시계열 식 구문 | Parquet의 속성 열 이름 |
---|---|---|---|
Azure Time Series Insights Gen2 데이터 형식은 열 이름의 끝에 "_<dataType>"로 추가됩니다. | "type": "Accumulated Heat" |
$event.type.String |
type_string |
이벤트 원본 타임스탬프 속성 스토리지의 "타임스탬프"로 Azure Time Series Insights Gen2에 저장되고 값은 UTC에 저장됩니다. 이벤트 원본의 타임스탬프 속성을 자신의 해결책의 필요에 맞게 사용자 지정할 수 있지만, 웜 및 콜드 스토리지에서는 열 이름이 "타임스탬프"입니다. 이벤트 원본 타임스탬프가 아닌 다른 datetime JSON 속성은 위의 규칙에 설명된 대로 열 이름에 "_datetime"로 저장됩니다. | "ts": "2020-03-19 14:40:38.318" |
$event.$ts |
timestamp |
특수 문자를 포함하는 JSON 속성 이름입니다. \[ \와 '는 ['와 ']를 사용하여 이스케이프됩니다. | "id.wasp": "6A3090FD337DE6B" |
$event['id.wasp'].String |
['id.wasp']_string |
[' 및 '] 내에는 작은따옴표와 백슬라이시의 추가 이스케이프가 있습니다. 작은따옴표는 \'로 작성되고 백슬래시는 \\로 작성됩니다. | "Foo's Law Value": "17.139999389648" |
$event['Foo\'s Law Value'].Double |
['Foo\'s Law Value']_double |
중첩된 JSON 객체는 마침표를 구분 기호로 하여 평탄화됩니다. 최대 10단계까지 중첩이 지원됩니다. | "series": {"value" : 316 } |
$event.series.value.Long , $event['series']['value'].Long 또는 $event.series['value'].Long |
series.value_long |
기본 형식의 배열은 동적 형식으로 저장됩니다. | "values": [154, 149, 147] |
동적 형식은 GetEvents API를 통해서만 검색할 수 있습니다. | values_dynamic |
객체를 포함하는 배열은 객체의 내용에 따라 두 가지 동작을 합니다. 배열 내 객체에 TS ID 또는 타임스탬프 속성(들)이 포함된 경우, 초기 JSON 페이로드가 여러 이벤트를 생성하도록 배열이 언롤됩니다. 이렇게 하면 여러 이벤트를 하나의 JSON 구조로 일괄 처리할 수 있습니다. 배열의 피어인 최상위 속성은 모두 언롤되지 않은 각 개체와 함께 저장됩니다. TS ID와 타임스탬프가 배열 내에서 이고이 아니면 전체가 동적 형식으로 저장됩니다. | 아래의 A, B및 C 예제를 참조하세요. | ||
혼합 요소가 포함된 배열은 평면화되지 않습니다. | "values": ["foo", {"bar" : 149}, 147] |
동적 형식은 GetEvents API를 통해서만 검색할 수 있습니다. | values_dynamic |
512자 JSON 속성 이름 제한입니다. 이름이 512자를 초과하면 512자로 잘리고 '_<'hashCode'>'가 추가됩니다. 이것은 내포된 객체 경로를 나타내기 위해 객체를 평면화하여 연결한 속성 이름에도 적용됩니다. | "data.items.datapoints.values.telemetry<...continuing to over 512 chars>" : 12.3440495 |
"$event.data.items.datapoints.values.telemetry<...continuing to include all chars>.Double" |
data.items.datapoints.values.telemetry<...continuing to 512 chars>_912ec803b2ce49e4a541068d495ab570_double |
배열의 이중 동작 이해
개체 배열은 데이터를 모델링한 방법에 따라 전체 또는 여러 이벤트로 분할됩니다. 이렇게 하면 배열을 사용하여 이벤트를 일괄 처리하고 루트 개체 수준에서 정의된 원격 분석 속성을 반복하지 않도록 할 수 있습니다. 일괄 처리는 전송된 Event Hubs 또는 IoT Hub 메시지 수가 줄어들기 때문에 유리할 수 있습니다.
그러나 경우에 따라 개체를 포함하는 배열은 다른 값의 컨텍스트에서만 의미가 있습니다. 여러 이벤트를 만들면 데이터가 의미가 없습니다. 개체 배열이 동적 타입으로 as-is 저장되도록 하려면 아래 데이터 모델링 지침을 따르고, C 예제를 참조하십시오
내 개체 배열이 여러 이벤트를 생성할지를 아는 방법
하나 이상의 시계열 ID 속성(들)이 배열 내의 개체에 중첩되어 있거나 이벤트 원본 타임스탬프 속성이 중첩되어 있는 경우, 수집 엔진이 또는으로 이를 분할하여 여러 이벤트를 생성합니다. TS ID 및/또는 타임스탬프에 제공한 속성 이름은 위의 평면화 규칙을 따라야 하므로 JSON의 모양을 나타냅니다. 아래 예제를 참조하고 시계열 ID 속성을 선택하는 방법에 대한 가이드를 확인하세요.
예제 A
개체 루트의 시계열 ID 및 중첩된 타임스탬프
환경 시계열 ID:"id"
이벤트 원본 타임스탬프:"values.time"
JSON 페이로드:
[
{
"id": "caaae533-1d6c-4f58-9b75-da102bcc2c8c",
"values": [
{
"time": "2020-05-01T00:59:59.000Z",
"value": 25.6073
},
{
"time": "2020-05-01T01:00:29.000Z",
"value": 43.9077
}
]
},
{
"id": "1ac87b74-0865-4a07-b512-56602a3a576f",
"values": [
{
"time": "2020-05-01T00:59:59.000Z",
"value": 0.337288
},
{
"time": "2020-05-01T01:00:29.000Z",
"value": 4.76562
}
]
}
]
Parquet 파일의 결과:
위의 구성 및 페이로드는 세 개의 열과 4개의 이벤트를 생성합니다.
타임 스탬프 | id_string | values.value_double |
---|---|---|
2020-05-01T00:59:59.000Z |
caaae533-1d6c-4f58-9b75-da102bcc2c8c |
25.6073 |
2020-05-01T01:00:29.000Z |
caaae533-1d6c-4f58-9b75-da102bcc2c8c |
43.9077 |
2020-05-01T00:59:59.000Z |
1ac87b74-0865-4a07-b512-56602a3a576f |
0.337288 |
2020-05-01T01:00:29.000Z |
1ac87b74-0865-4a07-b512-56602a3a576f |
4.76562 |
예제 B
하나의 속성이 중첩된 복합 시계열 ID
환경 시계열 ID:"plantId"
및 "telemetry.tagId"
이벤트 원본 타임스탬프:"timestamp"
JSON 페이로드:
[
{
"plantId": "9336971",
"timestamp": "2020-01-22T16:38:09Z",
"telemetry": [
{
"tagId": "100231-A-A6",
"tagValue": -31.149018
},
{
"tagId": "100231-A-A1",
"tagValue": 20.560796
},
{
"tagId": "100231-A-A9",
"tagValue": 177
},
{
"tagId": "100231-A-A8",
"tagValue": 420
},
]
},
{
"plantId": "9336971",
"timestamp": "2020-01-22T16:42:14Z",
"telemetry": [
{
"tagId": "103585-A-A7",
"value": -30.9918
},
{
"tagId": "103585-A-A4",
"value": 19.960796
}
]
}
]
parquet 파일의 결과:
위의 구성 및 페이로드는 4개의 열과 6개의 이벤트를 생성합니다.
타임 스탬프 | plantId_문자열 | telemetry.tagId_string | telemetry.value_double |
---|---|---|---|
2020-01-22T16:38:09Z |
9336971 |
100231-A-A6 |
-31.149018 |
2020-01-22T16:38:09Z |
9336971 |
100231-A-A1 |
20.560796 |
2020-01-22T16:38:09Z |
9336971 |
100231-A-A9 |
177 |
2020-01-22T16:38:09Z |
9336971 |
100231-A-A8 |
420 |
2020-01-22T16:42:14Z |
9336971 |
100231-A-A7 |
-30.9918 |
2020-01-22T16:42:14Z |
9336971 |
100231-A-A4 |
19.960796 |
예제 C
시계열 ID 및 타임스탬프가 개체 루트에 있습니다.
환경 시계열 ID:"id"
이벤트 원본 타임스탬프:"timestamp"
JSON 페이로드:
{
"id": "800500054755",
"timestamp": "2020-11-01T10:00:00.000Z",
"datapoints": [{
"value": 120
},
{
"value": 124
}
]
}
Parquet 파일에서 의 결과:
위의 구성 및 페이로드는 세 개의 열과 하나의 이벤트를 생성합니다.
타임 스탬프 | id_string | 데이터포인트_동적 |
---|---|---|
2020-11-01T10:00:00.000Z |
800500054755 |
[{"value": 120},{"value":124}] |
다음 단계
- 환경의 처리량 제한 이해