半结构化数据查询

Snowflake 中的数据管道自动化

Emily Melhuish

Technical Curriculum Developer, Snowflake

半结构化数据加载

数据加载.png

1 * Snowflake 学习资料
Snowflake 中的数据管道自动化

管理不同的数据结构

承运商 A 承运商 A 的 JSON

承运商 B

承运商 B 的 JSON

Snowflake 中的数据管道自动化

转换示例

截图 2026-05-11 17:56:34.png

Snowflake 中的数据管道自动化

Snowflake 数据类型

类别 类型 示例
数值 NUMBER, INT, FLOAT credits_used NUMBER(10,2)
文本 VARCHAR, STRING, TEXT carrier_name VARCHAR
日期/时间 DATE, TIME, TIMESTAMP dispatch_date DATE
布尔 BOOLEAN is_active BOOLEAN
半结构化 VARIANT, OBJECT, ARRAY event_payload VARIANT
Snowflake 中的数据管道自动化

VARIANT 类型

  • VARIANT 原样存储半结构化数据:无需架构
  • 直接加载 JSON、Parquet、Avro、ORC、XML
  • 结构在查询时解析,而非加载时(读时架构)
COPY INTO shipment_events
FROM @harbr_stage/events/
FILE_FORMAT = (TYPE = 'JSON');

VARIANT 词云,展示其可存储的半结构化类型:JSON、ARRAY、OBJECT、AVRO、PARQUET、SEMI-STRUCTURED

Snowflake 中的数据管道自动化

导航 JSON

JSON 示例

{
  "shipment_id": "SHP-001",
  "carrier": { "name": "FastFreight" },
  "stops": [
    { "location": "Rotterdam Port" },
    { "location": "Amsterdam Hub" }
  ]
}

导航 JSON

遍历结构:

<column>:<level1_element>.<level2_element>

SELECT 
event:id::STRING AS shipment_id
, event:carrier.name::STRING AS carrier
, event:stops[0]:location::STRING 
AS first_stop 
FROM shipment_events;
Snowflake 中的数据管道自动化

用 FLATTEN 将数组转为行

Flatten.png

Snowflake 中的数据管道自动化

使用 LATERAL FLATTEN

SELECT 
  s.event_data:shipment_id::STRING AS shipment_id,
  f.value:location::STRING AS stop,
  f.value:arrived_at::TIMESTAMP AS arrived_at 
FROM shipment_events s,
  LATERAL FLATTEN(input => s.event_data:stops) f;

Flatten.png

Snowflake 中的数据管道自动化

Passons à la pratique !

Snowflake 中的数据管道自动化

Preparing Video For Download...