다음을 통해 공유


dynamic 데이터 형식

스칼라 데이터 형식은 dynamic 다음 값 중 어느 것이든 될 수 있습니다.

  • 0부터 시작하는 인덱싱을 통해 0개 이상의 값이 포함된 dynamic 값의 배열
  • 고유한 string 값을 dynamic 값에 매핑하는 속성 모음. 속성 모음에는 고유한 string 값으로 인덱싱된 0개 이상의 이러한 매핑("슬롯"이라고 함)이 있습니다. 슬롯은 순서대로 정렬되지 않습니다.
  • 기본 스칼라 데이터 형식(bool, datetime, guid, int, long, real, stringtimespan)의 값
  • null 자세한 내용은 Null 값을 참조하세요.

참고

  • 형식 dynamic 의 값은 압축되지 않은 1MB(2^20)로 제한됩니다. 레코드의 셀 값이 1MB를 초과하면 값이 삭제되고 수집에 성공합니다. 인코딩 정책을 변경하여 열의 를 늘릴 MaxValueSize 수 있습니다.
  • 형식은 dynamic JSON과 유사하게 표시되지만 JSON 모델이 JSON에 존재하지 않기 때문에 JSON 모델이 나타내지 않는 값을 보유할 수 있습니다(예: long, , realdatetime, timespanguid). 따라서 dynamic 값을 JSON 표현으로 직렬화할 때 JSON에서 표현할 수 없는 값은 string 값으로 직렬화됩니다. 반대로 Kusto는 문자열을 강력한 형식의 값으로 구문 분석할 수 있는 경우 이 방식으로 구문 분석합니다. 이는 , , reallongguid 형식에 datetime적용됩니다. JSON 개체 모델에 대한 자세한 내용은 json.org 참조하세요.
  • Kusto는 속성 모음에서 이름-값 매핑의 순서를 유지하려고 시도하지 않으므로 유지할 순서를 가정할 수 없습니다. 예를 들어 매핑 집합이 동일한 두 개의 속성 모음이 string 값으로 표현되면 완전히 다른 결과를 생성할 수 있습니다.

동적 리터럴

리터럴을 dynamic 지정하려면 다음 구문 옵션 중 하나를 사용합니다.

구문 Description 예제
dynamic([value [, ...]]) 동적 또는 기타 스칼라 리터럴의 배열입니다. dynamic([1, 2, "hello"])
dynamic({=value [, ...]}) 속성 모음 또는 개체입니다. 키의 값은 중첩된 속성 모음일 수 있습니다. dynamic({"a":1, "b":{"a":2}})
dynamic(value) 내부 스칼라 데이터 형식의 값을 보유하는 동적 값입니다. dynamic(4)
dynamic(null) null 값을 나타냅니다.

구문 규칙에 대해 자세히 알아보세요.

동적 개체 접근자

사전에 대한 아래 첨자를 지정하려면 점 표기법(dict.key) 또는 대괄호 표기법(dict["key"])을 사용합니다. 아래 첨자가 문자열 상수인 경우 두 옵션은 모두 동일합니다.

참고

식을 아래 첨자로 사용하려면 대괄호 표기법을 사용합니다. 산술 식을 사용하는 경우 대괄호 안의 식을 괄호로 묶어야 합니다.

아래 예제에서 dictarr은 dynamic 형식의 열입니다.

접근자 식 형식 의미 의견
dict[col] 엔터티 이름(열) col 열의 값을 키로 사용하여 사전에 대한 아래 첨자를 지정합니다. 열은 문자열 형식이어야 합니다.
arr[index] 엔터티 인덱스(열) index 열의 값을 인덱스로 사용하여 배열에 대한 아래 첨자를 지정합니다. 열은 정수 또는 부울 형식이어야 합니다.
arr[-index] 엔터티 인덱스(열) 배열 끝에서 'index'번째 값을 검색합니다. 열은 정수 또는 부울 형식이어야 합니다.
arr[(-1)] 엔터티 인덱스 배열의 마지막 값을 검색합니다.
arr[toint(indexAsString)] 함수 호출 indexAsString 열의 값을 int 형식으로 캐스팅하고, 이를 사용하여 배열에 대한 아래 첨자를 지정합니다.
dict[['where']] 엔터티 이름(열)으로 사용되는 키워드 where 열의 값을 키로 사용하여 사전에 대한 아래 첨자를 지정합니다. 일부 쿼리 언어 키워드와 동일한 엔터티 이름을 따옴표로 묶어야 합니다.
dict.['where'] 또는 dict['where'] 상수 where 문자열을 키로 사용하여 사전에 대한 아래 첨자를 지정합니다.

가능한 경우 상수 아래 첨자를 사용하는 것이 좋습니다.

dynamic 값의 하위 개체에 액세스하면 하위 개체의 기본 형식이 다른 경우에도 다른 dynamic 값이 생성됩니다. gettype 함수를 사용하여 값의 실제 기본 형식을 검색하고, 아래에 나열된 캐스트 함수 중 하나를 사용하여 실제 형식으로 캐스팅합니다.

동적 개체 캐스팅

동적 개체에 대한 아래 첨자가 지정되면 값을 단순 형식으로 캐스팅해야 합니다.

형식
X parse_json('[100,101,102]') array
X[0] parse_json('100') dynamic
toint(X[1]) 101 int
Y parse_json('{"a1":100, "a b c":"2015-01-01"}') 사전
Y.a1 parse_json('100') dynamic
Y["a b c"] parse_json("2015-01-01") dynamic
todate(Y["a b c"]) datetime(2015-01-01) datetime

캐스트 함수는 다음과 같습니다.

  • tolong()
  • todouble()
  • todatetime()
  • totimespan()
  • tostring()
  • toguid()
  • parse_json()

동적 개체 작성

다음과 같은 몇 가지 함수를 사용하여 새 dynamic 개체를 만들 수 있습니다.

  • bag_pack() 는 이름/값 쌍에서 속성 모음을 만듭니다.
  • pack_array()는 이름/값 쌍에서 배열을 만듭니다.
  • range()는 산술 계열의 숫자가 포함된 배열을 만듭니다.
  • zip()은 두 배열의 "병렬" 값을 단일 배열로 쌍으로 변환합니다.
  • repeat()는 반복되는 값이 포함된 배열을 만듭니다.

또한 집계 값이 포함된 dynamic 배열을 만드는 다음과 같은 몇 가지 집계 함수가 있습니다.

  • buildschema()는 여러 dynamic 값의 집계 스키마를 반환합니다.
  • make_bag()은 그룹 내의 동적 값에 대한 속성 모음을 반환합니다.
  • make_bag_if()는 그룹 내의 동적 값에 대한 속성 모음을 반환합니다(조건자 사용).
  • make_list()는 모든 값이 순서대로 포함된 배열을 반환합니다.
  • make_list_if()는 모든 값이 순서대로 포함된 배열을 반환합니다(조건자 사용).
  • make_list_with_dvs()는 모든 값(null 값 포함)이 순서대로 포함된 배열을 반환합니다.
  • make_set()는 모든 고유 값이 포함된 배열을 반환합니다.
  • make_set_iffuel는 모든 고유 값이 포함된 배열을 반환합니다(조건자 사용).

동적 형식에 대한 연산자 및 함수

스칼라 동적/배열 함수에 대한 전체 목록은 동적/배열 함수를 참조하세요.

연산자 또는 함수 동적 데이터 형식 사용
in배열 배열의 요소가 == 인 경우 True입니다.
where City in ('London', 'Paris', 'Rome')
!in배열 == value배열의 요소가 없으면 True입니다.
array_length(array) 배열이 아니면 Null
bag_has_key(가방,) 동적 모음 열에 지정된 키가 포함되어 있는지 확인합니다.
bag_keys(bag) 동적 속성 모음 개체의 모든 루트 키를 열거합니다.
bag_merge(bag1,...,bagN) 동적 속성 모음을 모든 속성이 병합된 동적 속성 모음으로 병합합니다.
bag_set_key(bag,key,value) 지정된 키를 동적 속성 모음의 지정된 값으로 설정합니다.
extract_json(path,object), extract_json(path,object) 경로를 사용하여 개체로 이동합니다.
parse_json(source) JSON 개체를 동적 개체로 변환합니다.
range(from,to,step) 값의 배열입니다.
mv-expand listColumn 각 값에 대한 행을 지정된 셀의 목록에 복제합니다.
summarize buildschema() 열 콘텐츠에서 형식 스키마를 유추합니다.
summarize make_bag() 열의 속성 모음(사전) 값을 하나의 속성 모음으로 병합합니다(키 중복 포함 안 함).
summarize make_bag_if(열,조건자) 열의 속성 모음(사전) 값을 하나의 속성 모음으로 병합합니다(키 중복 포함 안 함, 조건자 사용).
summarize make_list() 행 그룹을 평면화하고 열의 값을 배열에 넣습니다.
summarize make_list_if(열,조건자) 행 그룹을 평면화하고, 열 값을 배열에 배치합니다(조건자 사용).
summarize make_list_with_nulls() 행 그룹을 평면화하고, 열 값(null 값 포함)을 배열에 배치합니다.
summarize make_set() 행 그룹을 평면화하고 열의 값을 중복 없이 배열에 넣습니다.

동적 데이터에 대한 인덱싱

모든 필드는 데이터 수집 중에 인덱싱됩니다. 인덱스의 범위는 단일 데이터 분할입니다.

동적 열을 인덱싱하기 위해 수집 프로세스는 동적 값(속성 이름, 값, 배열 요소) 내의 모든 "atomic" 요소를 열거하고 인덱스 작성기로 전달합니다. 그렇지 않으면 동적 필드에는 문자열 필드와 동일한 반전된 용어 인덱스가 있습니다.

예제

동적 속성 모음

다음 쿼리는 동적 속성 모음을 만듭니다.

print o=dynamic({"a":123, "b":"hello", "c":[1,2,3], "d":{}})
| extend a=o.a, b=o.b, c=o.c, d=o.d

편의상 쿼리 텍스트 자체에 표시되는 dynamic 리터럴은 datetime, timespan, real, long, guid, booldynamic 형식의 다른 Kusto 리터럴도 포함할 수 있습니다. 문자열을 구문 분석하는 경우(예: parse_json 함수를 사용하거나 데이터를 수집하는 경우) JSON을 통한 이 확장은 사용할 수 없지만, 다음 작업을 수행할 수 있습니다.

print d=dynamic({"a": datetime(1970-05-11)})

JSON 인코딩 규칙을 따르는 string 값을 dynamic 값으로 구문 분석하려면 parse_json 함수를 사용합니다. 다음은 그 예입니다.

  • parse_json('[43, 21, 65]') - 숫자의 배열
  • parse_json('{"name":"Alan", "age":21, "address":{"street":432,"postcode":"JLK32P"}}') - 사전
  • parse_json('21') - 숫자를 포함하는 동적 형식의 단일 값
  • parse_json('"21"') - 문자열을 포함하는 동적 형식의 단일 값
  • parse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}') - 위의 예제와 동일한 값을 o 제공합니다.

참고

JavaScript와 달리 JSON은 문자열 및 속성 모음 속성 이름 주위에 큰따옴표(") 문자를 사용해야 합니다. 따라서 일반적으로 작은따옴표(') 문자를 사용하여 JSON 인코딩 문자열 리터럴을 묶는 것이 더 쉽습니다.

동적 열로 데이터 수집

다음 예제에서는 열과 datetime 열을 포함하는 dynamic 테이블을 정의한 다음 단일 레코드를 수집하는 방법을 보여 줍니다. 또한 CSV 파일에서 JSON 문자열을 인코딩하는 방법을 보여 줍니다.

// dynamic is just like any other type:
.create table Logs (Timestamp:datetime, Trace:dynamic)

// Everything between the "[" and "]" is parsed as a CSV line would be:
// 1. Since the JSON string includes double-quotes and commas (two characters
//    that have a special meaning in CSV), we must CSV-quote the entire second field.
// 2. CSV-quoting means adding double-quotes (") at the immediate beginning and end
//    of the field (no spaces allowed before the first double-quote or after the second
//    double-quote!)
// 3. CSV-quoting also means doubling-up every instance of a double-quotes within
//    the contents.

.ingest inline into table Logs
  [2015-01-01,"{""EventType"":""Demo"", ""EventValue"":""Double-quote love!""}"]

출력

타임스탬프 추적
2015-01-01 00:00:00.0000000 {"EventType":"Demo","EventValue":"Double-quote love!"}