แชร์ผ่าน


คิวรีไฟล์ JSON

นําไปใช้กับ:✅ จุดสิ้นสุดการวิเคราะห์ SQL และ Warehouse ใน Microsoft Fabric

ในบทความนี้ คุณจะได้เรียนรู้วิธีการสืบค้นไฟล์ JSON โดยใช้ Fabric SQL รวมถึง Fabric Data Warehouse และตําแหน่งข้อมูลการวิเคราะห์ SQL

JSON (JavaScript Object Notation) เป็นรูปแบบที่มีน้ําหนักเบาสําหรับข้อมูลกึ่งโครงสร้าง ซึ่งใช้กันอย่างแพร่หลายในข้อมูลขนาดใหญ่สําหรับสตรีมเซ็นเซอร์ การกําหนดค่า IoT บันทึก และข้อมูลเชิงพื้นที่ (เช่น GeoJSON)

ใช้ OPENROWSET เพื่อสืบค้นไฟล์ JSON โดยตรง

ใน Fabric Data Warehouse และตําแหน่งข้อมูลการวิเคราะห์ SQL สําหรับ Lakehouse คุณสามารถสืบค้นไฟล์ JSON ได้โดยตรงในทะเลสาบโดยใช้ OPENROWSET ฟังก์ชัน

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

เมื่อคุณสืบค้นไฟล์ JSON ด้วย OPENROWSET คุณเริ่มต้นด้วยการระบุเส้นทางของไฟล์ ซึ่งอาจเป็น URL โดยตรงหรือรูปแบบสัญลักษณ์ตัวแทนที่กําหนดเป้าหมายไฟล์อย่างน้อยหนึ่งไฟล์ ตามค่าเริ่มต้น Fabric จะฉายคุณสมบัติระดับบนสุดแต่ละรายการในเอกสาร JSON เป็นคอลัมน์แยกต่างหากในชุดผลลัพธ์ สําหรับไฟล์ JSON Lines แต่ละบรรทัดจะถือว่าเป็นแถวเดี่ยว จึงเหมาะสําหรับสถานการณ์การสตรีม

หากคุณต้องการการควบคุมเพิ่มเติม:

  • ใช้ส่วนคําสั่งทางเลือก WITH เพื่อกําหนด Schema อย่างชัดเจนและแมปคอลัมน์กับคุณสมบัติ JSON เฉพาะ รวมถึงเส้นทางที่ซ้อนกัน
  • ใช้เพื่อ DATA_SOURCE อ้างอิงตําแหน่งรากสําหรับเส้นทางสัมพัทธ์
  • กําหนดค่าพารามิเตอร์การจัดการข้อผิดพลาด เช่น MAXERRORS การจัดการปัญหาการแยกวิเคราะห์อย่างราบรื่น

กรณีการใช้งานไฟล์ JSON ทั่วไป

ประเภทไฟล์ JSON ทั่วไปและกรณีการใช้งานที่คุณสามารถจัดการได้ใน Microsoft Fabric:

  • ไฟล์ JSON ("JSON Lines") ที่คั่นด้วยบรรทัด โดยที่แต่ละบรรทัดเป็นเอกสาร JSON ที่ถูกต้องแบบสแตนด์อโลน (ตัวอย่างเช่น เหตุการณ์ การอ่าน หรือรายการบันทึก)
    • ไฟล์ทั้งหมดไม่จําเป็นต้องเป็นเอกสาร JSON ที่ถูกต้องเพียงฉบับเดียว แต่เป็นลําดับของออบเจ็กต์ JSON ที่คั่นด้วยอักขระบรรทัดใหม่
    • ไฟล์ที่มีรูปแบบนี้มักจะมีนา .jsonlมสกุล , .ldjsonหรือ .ndjson. เหมาะอย่างยิ่งสําหรับการสตรีมและเฉพาะสถานการณ์สมมติ - ผู้เขียนสามารถผนวกเหตุการณ์ใหม่เป็นบรรทัดใหม่ได้โดยไม่ต้องเขียนไฟล์ใหม่หรือทําลายโครงสร้าง
  • ไฟล์ JSON เอกสารเดียว ("JSON แบบคลาสสิก") ที่มี .json นามสกุลที่ไฟล์ทั้งหมดเป็นเอกสาร JSON ที่ถูกต้องหนึ่งฉบับ ไม่ว่าจะเป็นวัตถุเดียวหรืออาร์เรย์ของวัตถุ (อาจซ้อนกัน)
    • โดยทั่วไปจะใช้สําหรับการกําหนดค่า สแนปช็อต และชุดข้อมูลที่ส่งออกในชิ้นเดียว
    • ตัวอย่างเช่น ไฟล์ GeoJSON มักจะจัดเก็บออบเจ็กต์ JSON เดียวที่อธิบายคุณลักษณะและรูปทรงเรขาคณิต

สืบค้นไฟล์ JSONL ด้วย OPENROWSET

Fabric Data Warehouse และตําแหน่งข้อมูลการวิเคราะห์ SQL สําหรับ Lakehouse ช่วยให้นักพัฒนา SQL สามารถคิวรีไฟล์ JSON Lines (.jsonl, .ldjson, .ndjson) ได้โดยตรงจาก Data Lake โดยใช้ OPENROWSET ฟังก์ชัน

ไฟล์เหล่านี้มีออบเจ็กต์ 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 แต่ละรายการโดยอัตโนมัติ และส่งคืนเป็นคอลัมน์

อย่างไรก็ตาม คุณสามารถกําหนด Schema ได้อย่างชัดเจนเพื่อควบคุมคุณสมบัติที่ส่งคืนและแทนที่ชนิดข้อมูลที่อนุมาน:

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

คําจํากัดความ Schema ที่ชัดเจนมีประโยชน์เมื่อ:

  • คุณต้องการแทนที่ชนิดที่อนุมานเริ่มต้น (ตัวอย่างเช่น เพื่อบังคับชนิดข้อมูล วันที่ แทน varchar)
  • คุณต้องมีชื่อคอลัมน์ที่เสถียรและการฉายภาพแบบเลือก
  • คุณต้องการแมปคอลัมน์กับคุณสมบัติ JSON ที่เฉพาะเจาะจง รวมถึงเส้นทางที่ซ้อนกัน

อ่านโครงสร้าง JSON ที่ซับซ้อน (ซ้อนกัน) ด้วย OPENROWSET

Fabric Data Warehouse และตําแหน่งข้อมูลการวิเคราะห์ SQL สําหรับ Lakehouse ช่วยให้นักพัฒนา SQL สามารถอ่าน JSON ด้วยออบเจ็กต์ที่ซ้อนกันหรืออาร์เรย์ย่อยได้โดยตรงจากทะเลสาบโดยใช้OPENROWSET

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

Note

ตัวอย่างนี้ใช้ เส้นทางสัมพัทธ์ที่ไม่มีแหล่งข้อมูล ซึ่งทํางานเมื่อสืบค้นไฟล์ใน Lakehouse ของคุณผ่านตําแหน่งข้อมูลการวิเคราะห์ SQL ใน Fabric Data Warehouse คุณต้อง:

  • ใช้เส้นทางแบบ สัมบูรณ์ ไปยังไฟล์ หรือ
  • ระบุ URL ราก ในแหล่งข้อมูลภายนอก และอ้างอิงใน OPENROWSET คําสั่งโดยใช้ DATA_SOURCE อ็อพชัน

ขยายอาร์เรย์ที่ซ้อนกัน (JSON เป็นแถว) ด้วย OPENROWSET

Fabric Data Warehouse และตําแหน่งข้อมูลการวิเคราะห์ SQL สําหรับ Lakehouse ช่วยให้คุณอ่านไฟล์ 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. อ่านเอกสาร JSON จากทะเลสาบโดยใช้ OPENROWSETการฉายคุณสมบัติชนิดระดับบนสุดพร้อมกับอาร์เรย์คุณลักษณะดิบ
  2. นําไปใช้ CROSS APPLY OPENJSON เพื่อขยายอาร์เรย์คุณสมบัติเพื่อให้แต่ละองค์ประกอบกลายเป็นแถวของตัวเองในชุดผลลัพธ์ ภายในส่วนขยายนี้ คิวรีจะแยกค่าที่ซ้อนกันโดยใช้นิพจน์เส้นทาง JSON ค่า เช่น shapeName, shapeISOและ geometry รายละเอียด เช่น geometry.type และ coordinates, เป็นคอลัมน์แบบแบนเพื่อให้วิเคราะห์ได้ง่ายขึ้น
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;