Dotaz na soubory JSON

Platí pro:✅ Koncový bod analýzy SQL a datový sklad v Microsoft Fabric

V tomto článku se dozvíte, jak dotazovat soubory JSON pomocí Prostředků infrastruktury SQL, včetně Služby Fabric Data Warehouse a koncového bodu analýzy SQL.

JSON (JavaScript Object Notation) je jednoduchý formát pro částečně strukturovaná data, široce používaný ve velkých objemech dat pro datové proudy senzorů, konfigurace IoT, protokoly a geoprostorová data (například GeoJSON).

Použití OPENROWSET k přímému dotazování souborů JSON

Ve službě Fabric Data Warehouse a koncovém bodu analýzy SQL pro Lakehouse můžete pomocí funkce dotazovat soubory JSON přímo v jezeře OPENROWSET .

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

Při dotazování souborů JSON pomocí OPENROWSET začnete zadáním cesty k souboru, což může být přímá adresa URL nebo vzor zástupných znaků, který cílí na jeden nebo více souborů. Ve výchozím nastavení Fabric mapuje každou vlastnost na nejvyšší úrovni v dokumentu JSON jako samostatný sloupec v sadě výsledků. U souborů ŘÁDKŮ JSON se každý řádek považuje za samostatný řádek, takže je ideální pro scénáře streamování.

Pokud potřebujete větší kontrolu:

  • Pomocí volitelné WITH klauzule můžete definovat schéma explicitně a mapovat sloupce na konkrétní vlastnosti JSON, včetně vnořených cest.
  • Použijte DATA_SOURCE, abyste odkazovali na kořenové umístění pro relativní cesty.
  • Nakonfigurujte parametry zpracování chyb, jako MAXERRORS, k elegantní správě problémů s analýzou.

Běžné případy použití souborů JSON

Běžné typy souborů JSON a případy použití, které můžete zpracovat v Microsoft Fabric:

  • Řádkově oddělené soubory JSON ("JSON Lines"), kde každý řádek je samostatný, platný dokument JSON (například událost, záznam nebo položka protokolu).
    • Celý soubor nemusí nutně být jediným platným dokumentem JSON. Jde o posloupnost objektů JSON oddělených znaky nového řádku.
    • Soubory s tímto formátem obvykle mají přípony .jsonl, .ldjsonnebo .ndjson. Ideální pro scénáře streamování a pouze připojování - autoři mohou přidat novou událost jako nový řádek bez nutnosti přepisovat soubor nebo narušovat strukturu.
  • Soubory JSON s jedním dokumentem ("classic JSON") s .json příponou, ve které je celý soubor platným dokumentem JSON – buď jeden objekt, nebo pole objektů (potenciálně vnořené).
    • Běžně se používá pro konfiguraci, snímky a datové sady exportované v jedné části.
    • Například soubory GeoJSON obvykle ukládají jeden objekt JSON popisující funkce a jejich geometrie.

Dotazování souborů JSONL pomocí OPENROWSET

Fabric Data Warehouse a koncový bod SQL Analytics pro Lakehouse umožňují vývojářům SQL dotazovat se na soubory JSON Lines (.jsonl, .ldjson, .ndjson) přímo z datového jezera pomocí OPENROWSET funkce.

Tyto soubory obsahují jeden platný objekt JSON na řádku, což je ideální pro scénáře streamování a pouze připojování. Pokud chcete přečíst soubor ŘÁDKŮ JSON, zadejte jeho adresu URL v argumentu BULK :

SELECT TOP 10 *
FROM OPENROWSET(
    BULK 'https://<storage account>.blob.core.windows.net/public/<subfolder>/<file name>.jsonl'
);

Ve výchozím nastavení OPENROWSET používá odvozování schématu, automaticky zjišťuje všechny vlastnosti nejvyšší úrovně v každém objektu JSON a vrací je jako sloupce.

Můžete však explicitně definovat schéma, které určuje, které vlastnosti se vrátí, a přepsat tak odvozené datové typy.

SELECT TOP 10 *
FROM OPENROWSET(
    BULK 'https://<storage account>.blob.core.windows.net/public/<subfolder>/<file name>.jsonl'
) WITH (
    country_region VARCHAR(100),
    confirmed INT,
    date_reported DATE '$.updated'
);

Explicitní definice schématu je užitečná v následujících případech:

  • Chcete přepsat výchozí odvozené typy (například vynutit datový typ date místo varchar).
  • Potřebujete stabilní názvy sloupců a selektivní projekci.
  • Chcete namapovat sloupce na konkrétní vlastnosti JSON, včetně vnořených cest.

Čtení složitých (vnořených) struktur JSON pomocí OPENROWSET

Fabric Data Warehouse a koncový bod analýzy SQL pro Lakehouse umožňují vývojářům SQL číst JSON pomocí vnořených objektů nebo dílčích polí přímo z jezera pomocí OPENROWSET.

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

V následujícím příkladu zadejte dotaz na soubor, který obsahuje ukázková data, a pomocí WITH klauzule explicitně promítejte vlastnosti na úrovni listu:

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'
  );

Poznámka:

Tento příklad používá relativní cestu bez zdroje dat, která funguje při dotazování souborů ve službě Lakehouse prostřednictvím koncového bodu analýzy SQL. V Fabric Data Warehouse můžete buď:

  • Použijte absolutní cestu k souboru nebo
  • Zadejte kořenovou adresu URL v externím zdroji dat a odkazujte na ni v OPENROWSET příkazu pomocí DATA_SOURCE možnosti.

Rozšíření vnořených polí (JSON na řádky) pomocí OPENROWSET

Služba Fabric Data Warehouse a koncový bod SQL Analytics pro Lakehouse umožňují číst soubory JSON s vnořenými poli pomocí OPENROWSET. Potom můžete tato pole rozbalit (zrušit) pomocí .CROSS APPLY OPENJSON Tato metoda je užitečná, když dokument nejvyšší úrovně obsahuje dílčí pole, které chcete použít jako jeden řádek na prvek.

Ve zjednodušeném příkladu vstupu má dokument podobný GeoJSON pole funkcí:

{
  "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]]]
      }
    }
  ]
}

Následující dotaz:

  1. Načte dokument JSON z jezera pomocí OPENROWSET, zobrazením atributu typu na nejvyšší úrovni spolu s polem surových charakteristik.
  2. Použije CROSS APPLY OPENJSON k rozšíření pole prvků tak, aby se každý prvek stal vlastním řádkem v sadě výsledků. V rámci tohoto rozšíření dotaz extrahuje vnořené hodnoty pomocí výrazů cesty JSON. Hodnoty jako shapeName, shapeISO a geometry a podrobnosti jako geometry.type a coordinates jsou nyní uspořádány jako ploché sloupce pro snadnější analýzu.
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;