본문 바로가기
데이터 엔지니어링

Druid flatten spec 공식 문서

by 내기록 2023. 3. 26.
반응형

FlattenSpec 

드루이드 중첩 열(nested columns) 특징의 대안으로, 그리고 nested input 포맷에 대해 중첩된 데이터를 평탄화하기 위해 'flattenSpec' 객체를 사용할 수 있습니다.

 

Nested columns에서 중첩된(nested) 데이터를 수집하고 저장하는 방법에 대해 알아보겠습니다.

 

Configure

Field Description Default
useFieldDiscovery true일때, 모든 루트 수준 필드를 'timestampSpec', 'transformSpec', 'dimensionSpec', 'metricsSpec' 에서 사용할 수 있는 필드로 전환합니다.

false이면, 명시적으로 지정된 필드만 사용할 수 있습니다.
true
fields 명시적으로 지정된 필드입니다.
특정 필드의 액세스 방법을 지정합니다.
[]

 

예제)

"flattenSpec": {
  "useFieldDiscovery": true,
  "fields": [
    { "name": "baz", "type": "root" },
    { "name": "foo_bar", "type": "path", "expr": "$.foo.bar" },
    { "name": "foo_other_bar", "type": "tree", "nodes": ["foo", "other", "bar"] },
    { "name": "first_food", "type": "jq", "expr": ".thing.food[1]" }
  ]
}

 

드루이드는 입력 데이터 레코드를 읽은 후, timestampSpec, transformSpec, dimensionsSpec, or metricsSpec 과 같은 다른 스펙을 적용하기 전에 flattenSpec을 적용합니다. 이렇게 되면 예를 들어, flattened 데이터 에서 타임스탬프를 추출하고, 변환(transformation), 차원 목록(dimension list), 메트릭 생성(generating metrics) 시에  flattened 데이터를 참조할 수 있습니다.

 

flattening은 중첩(nesting)을 지원하는 데이터 형식(avro, json, orc, parquet ..)에 대해서만 지원됩니다.

 

Field flattening specifications

Field Description Default
type - root : 레코드의 루트 레벨에 있는 필드를 참조합니다.
             'useFieldDiscovery=false' 일때만 사용
- path : JsonPath 표기법을 상요하여 필드를 참조합니다.
              nesting을 제공하는 대부분의 데이터 형식(avro, json, orc, parquet)에서 지원
- jq : jackson-jq 표기법을 사용하여 필드를 참조하며 json 형식에서만 지원
- tree : 레코드의 루트 수준에서 중첩된 필드를 참조.
             간단한 계층을 가져올 때 path 또는 jq보다 효율적이며 json 형식에서만 지원
none(requeired)
name flattening 된 이후의 필드명으로
timestampSpec, transformSpec, dimensionsSpec, metricsSpec에서 사용 가능
none(requeired)
expr flattening동안 필드에 액세스 하기 위한 표현식으로
path 타입은 JsonPath 이며, jq 타입은 jackson-jq 표기법을 사용
다른 유형은 이 매개변수는 무시됩니다.
none
(path, jq만 필요)
nodes 트리 전용으로, flattening 동안 필드에 액세스 하기 위한 다중 표현실 필드로,
읽을 필드 이름의 계층 구조를 나타냅니다.
다른 유형은 이 매개변수를 사용하지 않습니다.
none(tree만 필요)

 

flattening 관련 참고사항

  • 편의를 위해, root 수준 필드를 정의할 때 JSON 객체 대신 필드 이름만 문자열로 정의할 수 있습니다.
    예) {"name":"baz", "type":"root"}는 "baz"와 동일합니다.
  • useFieldDiscovery를 활성화하면 root 수준에서 드루이드가 지원하는 데이터 유형에 해당하는 단순 필드만 자동으로 감지합니다.
    자동 감지 필드는 문자열, 숫자, 문자열 리스트 또는 숫자 리스트이며, 다른 유형은 자동으로 감지되지 않으므로 fields에 명시적으로 지정해야 합니다.
  • 중복 필드 name은 허용하지 않습니다.
  • useFieldDiscovery를 활성화했을 때, 필드 목록에 정의된 필드와 이름이 같은 필드가 있으면 건너뛰게 됩니다.

 

 

References

https://druid.apache.org/docs/latest/ingestion/data-formats.html#flattenspec

반응형

댓글