次の方法で共有


JSON ファイルのクエリ

適用対象:✅ Microsoft Fabric の SQL 分析エンドポイントおよびウェアハウス

この記事では、Fabric Data Warehouse や SQL 分析エンドポイントなど、Fabric SQL を使用して JSON ファイルに対してクエリを実行する方法について説明します。

JSON (JavaScript Object Notation) は半構造化データの軽量形式で、センサー ストリーム、IoT 構成、ログ、地理空間データ (GeoJSON など) のビッグ データで広く使用されています。

OPENROWSET を使用して JSON ファイルに直接クエリを実行する

Fabric Data Warehouse と Lakehouse の SQL 分析エンドポイントでは、 OPENROWSET 関数を使用して、レイク内の JSON ファイルに直接クエリを実行できます。

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

OPENROWSET を使用して JSON ファイルに対してクエリを実行する場合は、最初にファイル パスを指定します。これは、直接 URL または 1 つ以上のファイルを対象とするワイルドカード パターンです。 既定では、Fabric は JSON ドキュメント内の各最上位プロパティを結果セット内の個別の列としてプロジェクトします。 JSON Lines ファイルの場合、各行は個々の行として扱われ、ストリーミング シナリオに最適です。

より詳細な制御が必要な場合:

  • オプションの WITH 句を使用してスキーマを明示的に定義し、入れ子になったパスを含む特定の JSON プロパティに列をマップします。
  • DATA_SOURCEを使用して、相対パスのルート位置を参照します。
  • 解析の問題を適切に管理するために、 MAXERRORS などのエラー処理パラメーターを構成します。

一般的な JSON ファイルのユース ケース

Microsoft Fabric で処理できる一般的な JSON ファイルの種類とユース ケース:

  • 各行がスタンドアロンの有効な JSON ドキュメント (イベント、読み取り、ログ エントリなど) である行区切り JSON ("JSON Lines") ファイル。
    • ファイル全体は必ずしも単一の有効な JSON ドキュメントではなく、改行文字で区切られた一連の JSON オブジェクトです。
    • 通常、この形式のファイルには、拡張子 .jsonl.ldjson、または .ndjsonがあります。 ストリーミングおよび追加のみのシナリオに最適です。ライターは、ファイルを書き換えたり、構造を壊したりすることなく、新しいイベントを新しい行として追加できます。
  • .json拡張子を持つ単一ドキュメント JSON ("クラシック JSON") ファイル。ファイル全体が 1 つの有効な JSON ドキュメントであり、1 つのオブジェクトまたはオブジェクトの配列 (入れ子になっている可能性があります)。
    • これは一般的に、1 つの部分でエクスポートされた構成、スナップショット、およびデータセットに使用されます。
    • たとえば、GeoJSON ファイルには、通常、特徴とそのジオメトリを記述する単一の JSON オブジェクトが格納されます。

OPENROWSET を使用して JSONL ファイルにクエリを実行する

Fabric Data Warehouse と Lakehouse の SQL 分析エンドポイントを使用すると、SQL 開発者は、 OPENROWSET 関数を使用して、データ レイクから JSON Lines (.jsonl、.ldjson、.ndjson) ファイルに直接クエリを実行できます。

これらのファイルには 1 行に 1 つの有効な JSON オブジェクトが含まれており、ストリーミングと追加のみのシナリオに最適です。 JSON Lines ファイルを読み取る場合は、 BULK 引数にその URL を指定します。

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 構造体を読み取る

Fabric Data Warehouse と 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 内のファイルに対してクエリを実行するときに機能します。 Fabric Data Warehouse では、次のいずれかを行う必要があります。

  • ファイルへの 絶対パス を使用するか、
  • 外部データ ソースでルート URL を指定し、OPENROWSET オプションを使用して DATA_SOURCE ステートメントで参照します。

OPENROWSET を使用して入れ子になった配列 (JSON から行) を展開する

Fabric Data Warehouse と Lakehouse の SQL 分析エンドポイントを使用すると、 OPENROWSETを使用して入れ子になった配列を含む JSON ファイルを読み取ります。 次に、 CROSS APPLY OPENJSONを使用して、これらの配列を展開 (非ネスト) できます。 このメソッドは、最上位のドキュメントに要素ごとに 1 行として必要なサブ配列が含まれている場合に便利です。

次の簡略化された入力例では、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 パス式を使用して入れ子になった値を抽出します。 shapeNameshapeISOなどの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;