다음을 통해 공유


JSON 파일 쿼리

적용 대상:✅ Microsoft Fabric의 SQL 분석 엔드포인트 및 웨어하우스

이 문서에서는 패브릭 데이터 웨어하우스 및 SQL 분석 엔드포인트를 포함하여 패브릭 SQL을 사용하여 JSON 파일을 쿼리하는 방법을 알아봅니다.

JSON(JavaScript 개체 표기법)은 센서 스트림, IoT 구성, 로그 및 지리 공간적 데이터(예: GeoJSON)에 대한 빅 데이터에 널리 사용되는 반구조화된 데이터에 대한 간단한 형식입니다.

OPENROWSET을 사용하여 JSON 파일을 직접 쿼리

Lakehouse를 위한 Fabric Data Warehouse 및 SQL 분석 엔드포인트에서 OPENROWSET 함수를 사용하여 레이크 내의 JSON 파일을 직접 쿼리할 수 있습니다.

OPENROWSET( BULK '{{filepath}}', [ , <options> ... ])
[ WITH ( <column schema and mappings> ) ];

OPENROWSET을 사용하여 JSON 파일을 쿼리하는 경우 먼저 하나 이상의 파일을 대상으로 하는 직접 URL 또는 와일드카드 패턴일 수 있는 파일 경로를 지정합니다. 기본적으로 Fabric은 JSON 문서의 각 최상위 속성을 결과 집합의 별도 열로 프로젝터합니다. JSON Lines 파일의 경우 각 줄은 개별 행으로 처리되므로 스트리밍 시나리오에 적합합니다.

더 많은 제어가 필요한 경우:

  • 선택적 WITH 절을 사용하여 스키마를 명시적으로 정의하고 중첩된 경로를 비롯한 특정 JSON 속성에 열을 매핑합니다.
  • 상대 경로에 대한 루트 위치를 참조하는 데 사용합니다 DATA_SOURCE .
  • 구문 분석 문제를 정상적으로 관리하는 것과 같은 MAXERRORS 오류 처리 매개 변수를 구성합니다.

일반적인 JSON 파일 사용 사례

Microsoft Fabric에서 처리할 수 있는 일반적인 JSON 파일 형식 및 사용 사례:

  • 각 줄이 독립 실행형 유효한 JSON 문서(예: 이벤트, 읽기 또는 로그 항목)인 줄로 구분된 JSON("JSON 줄") 파일입니다.
    • 전체 파일이 유효한 단일 JSON 문서가 아니라 줄 바꿈 문자로 구분된 JSON 개체의 시퀀스입니다.
    • 이 형식의 파일에는 일반적으로 확장명이 .jsonl.ldjson.ndjson있거나 . 스트리밍 및 추가 전용 시나리오 작성기에 이상적입니다. 작성기는 파일을 다시 쓰거나 구조를 중단하지 않고 새 이벤트를 새 줄로 추가할 수 있습니다.
  • 확장자 .json을(를) 사용하는 단일 문서 JSON("클래식 JSON") 파일은 전체 파일이 하나의 유효한 JSON 문서인 경우로, 단일 객체 또는 객체의 배열(잠재적으로 중첩될 수 있음)로 이루어져 있습니다.
    • 일반적으로 한 조각으로 내보낸 구성, 스냅샷 및 데이터 세트에 사용됩니다.
    • 예를 들어 GeoJSON 파일은 일반적으로 기능 및 해당 기하 도형을 설명하는 단일 JSON 개체를 저장합니다.

OPENROWSET을 사용하여 JSONL 파일 쿼리

Fabric Data Warehouse 및 Lakehouse용 SQL 분석 엔드포인트를 사용하면 SQL 개발자가 함수를 사용하여 OPENROWSET 데이터 레이크에서 직접 JSON Lines(.jsonl, .ldjson, .ndjson) 파일을 쿼리할 수 있습니다.

이러한 파일에는 한 줄당 하나의 유효한 JSON 개체가 포함되어 있어 스트리밍 및 추가 전용 시나리오에 적합합니다. JSON Lines 파일을 읽으려면 인수에 해당 URL을 BULK 제공합니다.

SELECT TOP 10 *
FROM OPENROWSET(
    BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.jsonl'
);

기본적으로 OPENROWSET 스키마 유추를 사용하여 각 JSON 개체의 모든 최상위 속성을 자동으로 검색하고 열로 반환합니다.

그러나 반환되는 속성을 제어하고 유추된 데이터 형식을 재정의하는 스키마를 명시적으로 정의할 수 있습니다.

SELECT TOP 10 *
FROM OPENROWSET(
    BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.jsonl'
) WITH (
    country_region VARCHAR(100),
    confirmed INT,
    date_reported DATE '$.updated'
);

명시적 스키마 정의는 다음과 같은 경우에 유용합니다.

  • 기본 유추 형식을 재정의하려고 합니다(예: varchar 대신 날짜 데이터 형식을 강제로 적용).
  • 안정적인 열 이름과 선택적 프로젝션이 필요합니다.
  • 중첩된 경로를 포함하여 열을 특정 JSON 속성에 매핑하려고 합니다.

OPENROWSET을 사용하여 복합(중첩) JSON 구조 읽기

Lakehouse용 패브릭 데이터 웨어하우스 및 SQL 분석 엔드포인트를 사용하여 SQL 개발자가 OPENROWSET를 통해 레이크에서 중첩된 개체 또는 하위 배열을 포함한 JSON을 직접 읽을 수 있습니다.

{
  "type": "Feature",
  "properties": {
    "shapeName": "Serbia",
    "shapeISO": "SRB",
    "shapeID": "94879208B25563984444888",
    "shapeGroup": "SRB",
    "shapeType": "ADM0"
  }
}

다음 예제에서는 샘플 데이터가 포함된 파일을 쿼리하고 절을 WITH 사용하여 리프 수준 속성을 명시적으로 프로젝트합니다.

SELECT
    *
FROM
  OPENROWSET(
    BULK '/Files/parquet/nested/geojson.jsonl'
  )
  WITH (
    -- Top-level field
    [type]     VARCHAR(50),
    -- Leaf properties from the nested "properties" object
    shapeName  VARCHAR(200) '$.properties.shapeName',
    shapeISO   VARCHAR(50)  '$.properties.shapeISO',
    shapeID    VARCHAR(200) '$.properties.shapeID',
    shapeGroup VARCHAR(50)  '$.properties.shapeGroup',
    shapeType  VARCHAR(50)  '$.properties.shapeType'
  );

비고

이 예제에서는 데이터 원본이 없는 상대 경로를 사용합니다. 이 경로는 SQL 분석 엔드포인트를 통해 Lakehouse 의 파일을 쿼리할 때 작동합니다. 패브릭 데이터 웨어하우스에서 다음 중 하나를 수행해야 합니다.

  • 파일의 절대 경로 사용 또는
  • 외부 데이터 원본에서 루트 URL을 지정하고 OPENROWSET 문에서 DATA_SOURCE 옵션을 사용하여 이를 참조합니다.

OPENROWSET을 사용하여 중첩된 배열(JSON에서 행으로) 확장

Fabric Data Warehouse 및 Lakehouse용 SQL 분석 엔드포인트를 사용하여 중첩된 배열이 있는 JSON 파일을 읽을 수 있습니다 OPENROWSET. 그런 다음, CROSS APPLY OPENJSON을 사용하여 해당 배열을 펼칠 수 있습니다. 이 메서드는 최상위 문서에 요소당 한 행으로 원하는 하위 배열이 포함된 경우에 유용합니다.

다음의 간단한 예제 입력에서 GeoJSON과 유사한 문서에는 기능 배열이 있습니다.

{
  "type": "FeatureCollection",
  "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
  "features": [
    {
      "type": "Feature",
      "properties": {
        "shapeName": "Serbia",
        "shapeISO": "SRB",
        "shapeID": "94879208B25563984444888",
        "shapeGroup": "SRB",
        "shapeType": "ADM0"
      },
      "geometry": {
        "type": "Line",
        "coordinates": [[[19.6679328, 46.1848744], [19.6649294, 46.1870428], [19.6638492, 46.1890231]]]
      }
    }
  ]
}

다음 쿼리는 다음과 같습니다.

  1. OPENROWSET을(를) 사용하여 레이크에서 JSON 문서를 읽고, 원시 기능 배열과 함께 최상위 형식 속성을 투영합니다.
  2. CROSS APPLY OPENJSON 각 요소가 결과 집합에서 고유한 행이 되도록 기능 배열을 확장하기 위해 적용됩니다. 이 확장 내에서 쿼리는 JSON 경로 식을 사용하여 중첩된 값을 추출합니다. 값 shapeName, shapeISO, 및 geometrygeometry.typecoordinates와 같은 세부 정보는 이제 분석을 용이하게 하기 위해 평판 열로 변환되었습니다.
SELECT
  r.crs_name,
  f.[type] AS feature_type,
  f.shapeName,
  f.shapeISO,
  f.shapeID,
  f.shapeGroup,
  f.shapeType,
  f.geometry_type,
  f.coordinates
FROM
  OPENROWSET(
      BULK '/Files/parquet/nested/geojson.jsonl'
  )
  WITH (
      crs_name    VARCHAR(100)  '$.crs.properties.name', -- top-level nested property
      features    VARCHAR(MAX)  '$.features'             -- raw JSON array
  ) AS r
CROSS APPLY OPENJSON(r.features)
WITH (
  [type]           VARCHAR(50),
  shapeName        VARCHAR(200)  '$.properties.shapeName',
  shapeISO         VARCHAR(50)   '$.properties.shapeISO',
  shapeID          VARCHAR(200)  '$.properties.shapeID',
  shapeGroup       VARCHAR(50)   '$.properties.shapeGroup',
  shapeType        VARCHAR(50)   '$.properties.shapeType',
  geometry_type    VARCHAR(50)   '$.geometry.type',
  coordinates      VARCHAR(MAX)  '$.geometry.coordinates'
) AS f;