반정형 데이터 소개

이 항목에서는 반정형 데이터에 대한 설명과 함께 Snowflake에서의 로딩 및 저장 방법에 대한 정보를 제공합니다.

이 항목의 내용:

반정형 데이터란 무엇입니까?

반정형 데이터란 기존의 정형 데이터 표준을 준수하지 않지만, 데이터 내에서 개별적인 고유 엔터티를 식별하는 태그(레이블) 또는 기타 타입의 마크업이 포함된 데이터입니다.

반정형 데이터와 정형 데이터를 구분하는 두 가지 주요 속성은 중첩 데이터 구조 및 고정 스키마가 없다는 점입니다.

  • 정형 데이터의 경우 관계형 데이터베이스 시스템에서 데이터를 로드 및 쿼리하려면 고정 스키마를 정의해야 합니다. 반정형 데이터의 경우 스키마에 대한 사전 정의가 필요하지 않으며 지속적으로 변경, 즉, 언제든지 새로운 속성을 추가할 수 있습니다.

    또한, 동일한 클래스 내의 엔터티는 함께 그룹화되어도 속성이 다를 수 있으며 속성의 순서는 중요하지 않습니다.

  • 데이터를 플랫 테이블로 표시하는 정형 데이터와 달리, 반정형 데이터의 경우 N 레벨 계층 구조의 중첩된 정보가 포함될 수 있습니다.

계층적 데이터란 무엇입니까?

반정형 데이터는 보통 계층 구조로 구성됩니다. 복잡한 데이터 구조는 어레이오브젝트 와 같이 더욱 단순한 데이터 타입을 중첩하여 만들 수 있습니다. (참고: Snowflake OBJECT는 〈사전〉 또는 〈지도’에 해당합니다. Snowflake 오브젝트는 〈오브젝트 지향 프로그래밍’이라는 의미에서의 〈오브젝트’가 아닙니다.)

예를 들어, JSON 데이터는 배열이 포함된 오브젝트를 포함할 수 있습니다. 해당 배열의 각 셀에는 중첩 오브젝트 또는 배열이 포함될 수 있습니다.

Snowflake 데이터 타입을 사용하면 데이터 타입의 다음 속성을 사용하여 반정형 데이터를 보유할 계층 구조를 구성할 수 있습니다.

  • VARIANT 는 ARRAY 또는 OBJECT등 기타 모든 데이터 타입의 값을 보유할 수 있습니다.

  • ARRAY 또는 OBJECT는 VARIANT 타입의 값을 보유합니다.

예를 들어, 다양한 타입의 자연 재해가 발생한 날짜를 저장하는 경우를 생각해 보겠습니다. 〈허리케인〉, 〈지진〉, 〈홍수〉 등의 키가 포함된 OBJECT를 생성할 수 있습니다. 각 키와 관련된 값은 각 타입의 재해가 발생한 날짜를 포함하는 ARRAY일 수 있습니다. 각 키-값 페어의 값은 VARIANT여야 하므로 날짜의 각 배열은 해당 OBJECT 내부의 VARIANT 안에 래핑된 ARRAY로 저장됩니다. 계층 구조의 최상위 수준은 다음과 유사합니다(중괄호는 키-값 페어를 포함하는 OBJECT를 나타냄).

{
    "Flood": flood_date_array::VARIANT,
    "Earthquake": earthquake_date_array::VARIANT,
    ...
}

또 다른 예로, 단일 재해 목록을 시간순으로 저장하는 경우를 생각해 보겠습니다. 이러한 경우에 외부 데이터 타입은 ARRAY일 수 있습니다. 해당 ARRAY의 각 셀에는 이벤트에 대한 정보와 함께 키-값 페어가 포함된 OBJECT(VARIANT로 래핑됨)가 포함될 수 있습니다. 예를 들어, 지진을 설명하는 각 OBJECT에는 〈타임스탬프〉, 〈위치〉 및 〈규모’와 같은 키가 있을 수 있습니다. 토네이도를 설명하는 각 OBJECT에는 〈타임스탬프〉 및 〈최대_풍속’과 같은 키가 있을 수 있습니다.

[
    {
        "Event_ID": 54::VARIANT,
        "Type": "Earthquake"::VARIANT,
        "Magnitude": 7.4::VARIANT,
        "Timestamp": "2018-06-09 12:32:15"::TIMESTAMP_LTZ::VARIANT
        ...
    }::VARIANT,
    {
        "Event_ID": 55::VARIANT,
        "Type": "Tornado"::VARIANT,
        "Maximum_wind_speed": 186::VARIANT,
        "Timestamp": "2018-07-01 09:42:55"::TIMESTAMP_LTZ::VARIANT
        ...
    }::VARIANT
]

거의 모든 깊이 또는 너비를 갖는 데이터 계층 구조를 생성하는 것이 가능합니다(각 데이터 타입에 대한 스토리지 한계까지). 예를 들어, 토네이도에 대한 정보가 포함된 OBJECT에는 토네이도 기간 동안 다른 시간의 풍속에 대한 정보가 필요할 수 있으므로 데이터 구조는 다음과 같을 수 있습니다.

  1. 최상위 레벨은 ARRAY입니다.

  2. 해당 ARRAY의 각 셀에는 1개의 토네이도를 설명하는 1개의 OBJECT가 있습니다.

  3. 각 OBJECT에는 풍속 데이터의 ARRAY가 포함됩니다.

  4. 내부 ARRAY의 각 셀은 다음과 같은 키가 있는 데이터를 포함하는 OBJECT입니다.

    • 풍속의 타임스탬프.

    • 풍속의 위치.

    • KPH(시간당 킬로미터) 단위의 풍속.

    일부 경우 데이터가 불완전할 수 있습니다. 예를 들어, 특정 위치의 풍속이 토네이도 이후의 가시적인 피해에 따라 추정된 경우(토네이도 기간 동안 직접 측정하지 않음), 데이터에는 위치와 풍속이 포함될 수 있지만 타임스탬프는 포함되지 않을 수 있습니다.

반정형 데이터 로드하기

Snowflake는 JSON, Avro, ORC, Parquet 및 XML 형식에서 반정형 데이터를 가져와 반정형 데이터를 지원하도록 특별히 설계된 Snowflake 데이터 타입 으로 저장할 수 있습니다.

데이터 구조, 데이터 크기, 사용자가 데이터를 가져오기 위해 선택한 방식에 따라 반정형 데이터를 단일 열에 저장하거나 여러 열로 분할할 수 있습니다.

반정형 데이터를 테이블에 로딩하는 단계는 정형 데이터를 테이블에 로딩하는 단계와 유사합니다. 그러나 반정형 데이터를 로딩 및 저장할 때 구조의 전체, 일부 또는 없음을 명시적으로 지정할 수도 있습니다.

  • 데이터가 키-값 페어의 세트인 경우 OBJECT 타입의 열에 로딩할 수 있습니다.

  • 데이터가 배열인 경우 ARRAY 타입의 열에 로딩할 수 있습니다.

  • 계층적 데이터란 무엇입니까? 가 있는 경우 다음 중 하나를 수행할 수 있습니다.

    • 여러 열로 데이터를 분할합니다. 다음을 수행할 수 있습니다.

      • 반정형 데이터의 열을 대상 테이블의 별도의 열로 명시적으로 추출 및 변환합니다.

      • Snowflake를 사용하여 스테이징된 반정형 데이터 파일에서 열 정의를 자동으로 감지 및 검색 합니다. 열 정의에서 Snowflake 테이블, 외부 테이블 또는 뷰를 생성합니다. 시간을 단축하려면, 스테이징된 파일에서 자동으로 검색된 열 정의를 사용하여 테이블을 생성합니다.

        참고

        • 감지 및 검색 기능은 미리 보기 기능으로 지원됩니다.

        • 이 감지 및 검색 기능은 현재 Apache Parquet, Apache Avro 및 ORC 파일로 제한됩니다.

    • 데이터를 VARIANT 타입의 단일 열에 저장합니다. 다음을 수행할 수 있습니다.

      • 구조를 명시적으로 지정합니다(예: VARIANT, ARRAY 및 OBJECT 데이터 타입의 계층 구조 지정).

      • 구조를 명시적으로 지정하지 않고 데이터를 로딩합니다. Snowflake가 인식하고 구문을 분석하는 데이터 타입(JSON, Avro, Parquet 또는 ORC)을 지정하면 데이터는 Snowflake VARIANT, ARRAY 및 OBJECT 데이터 타입을 사용하는 내부 데이터 형식으로 변환됩니다.

데이터가 복잡하거나 개별 값에 약 16MB 이상의 저장 공간이 필요한 경우, 기존 기술 중 1개 이상을 사용할 수 있습니다. 예를 들어, 데이터를 여러 열로 분할할 수 있으며 이러한 열 중 일부는 명시적으로 지정된 데이터 타입 계층 구조를 포함할 수 있습니다.

다음과 같은 방법으로 반정형 데이터를 로딩할 수 있습니다.

  • 테이블을 만들고 데이터를 로딩하는 동안 입력 데이터 형식과 Snowflake 데이터 타입을 지정합니다. 예를 들어 아래 코드에서 VARIANT 데이터 타입은 CREATE TABLE 문에 지정되는 반면, JSON 입력 데이터 형식은 COPY INTO <테이블> 명령의 TYPE = <데이터_형식> 절에 지정됩니다.

    CREATE TABLE my_table (my_variant_column VARIANT);
    COPY INTO my_table ... FILE FORMAT = (TYPE = 'JSON') ...
    
  • 데이터를 변환하는 적절한 함수를 호출하여 입력 데이터 형식과 Snowflake 데이터 타입을 지정합니다. 예를 들어 JSON 형식의 데이터를 VARIANT 값으로 변환하려면 아래와 같이 PARSE_JSON 을 호출하십시오.

    INSERT INTO my_table (my_variant_column) SELECT PARSE_JSON('{...}');
    

데이터가 ARRAY, OBJECT 또는 VARIANT 데이터 타입이거나 이러한 타입의 계층 구조에 저장되어 있는 경우 쿼리할 수 있습니다.

반정형 데이터 저장하기

반정형 데이터는 일반적으로 다음 Snowflake 데이터 타입으로 저장됩니다.

  • ARRAY: 기타 언어에서의 배열과 유사합니다.

  • OBJECT: JSON 오브젝트와 유사하며, 많은 언어에서는 《딕셔너리》, 《해시》 또는 《맵》이라고도 합니다. 여기에는 키-값 페어가 포함됩니다.

  • VARIANT: 다른 데이터 타입(ARRAY 및 OBJECT 포함)의 값을 보유할 수 있는 데이터 타입입니다. VARIANT를 사용하면 계층 데이터 를 생성 및 저장할 수 있습니다.

(가져온 데이터가 여러 열로 분할된 후에 저장되는 경우 해당 열의 일부 또는 전체가 FLOAT, VARCHAR 등과 같은 단순 데이터 타입이 될 수 있습니다.)

ARRAY, OBJECT 및 VARIANT 데이터 타입을 개별적으로 사용하거나 중첩하여 계층 구조를 만들 수 있습니다.

데이터를 JSON, Avro, ORC 또는 Parquet 형식으로 가져오는 경우 Snowflake는 계층 구조를 만들어 VARIANT 타입으로 저장할 수 있습니다. 또한, 수동으로 계층 구조를 만들 수도 있습니다.

계층 구조의 구성과 계없이 Snowflake는 ARRAY, OBJECT, VARIANT를 사용하는 최적화된 내부 저장소 형식으로 데이터를 변환합니다. 이러한 내부 저장 형식은 빠르고 효율적인 SQL 쿼리를 지원합니다.

ARRAY, OBJECT, VARIANT 데이터 타입에 대한 자세한 내용은 반정형 데이터 타입 섹션을 참조하십시오.

반정형 데이터 쿼리하기

Snowflake에서는 다음을 위한 연산자를 지원합니다.

반정형 데이터 쿼리에 대한 자세한 내용은 반정형 데이터 쿼리하기 섹션을 참조하십시오.

XML 태그를 지정하여 XML을 쿼리하는 방법에 대한 자세한 내용은 XMLGET 함수 설명서를 참조하십시오.

맨 위로 이동