DuckDB 处理不规则 JSON 数据:从"解析到崩溃"到 5 分钟出结果
场景引入:那个让数据分析师失眠的 JSON 文件
你有没有遇到过这种场景:
周一早上,业务方甩给你一个 JSON 文件,说"里面是用户行为数据,帮我把里面的关键指标提取出来做分析"。你打开一看——好家伙,几万行嵌套 JSON,字段还不一样,有的有 user_id,有的没有,有的嵌套了三层,有的数组里还套着对象。
用 Python 逐行解析?代码写了半天,跑起来还报 KeyError。用 Pandas 读?直接 OOM 内存溢出。用 Excel 打开?电脑直接卡死。
这就是"不规则 JSON"(Ragged JSON)的经典困境——每条记录的字段结构不一致,传统方法处理起来极其痛苦。
但如果你用 DuckDB,这一切可以在 5 分钟内搞定。

一、真实场景:电商平台的用户行为日志
假设你有一个 user_events.json 文件,每条记录格式如下:
{
"event_id": "evt_8a7f3b",
"user_id": 100234,
"timestamp": "2026-08-24T14:32:10Z",
"event_type": "purchase",
"properties": {
"product_id": "prod_9921",
"product_name": "无线蓝牙耳机",
"price": 299.00,
"quantity": 1,
"coupon_used": true,
"tags": ["electronics", "audio", "sale"]
},
"device": {
"type": "mobile",
"os": "iOS",
"app_version": "3.2.1"
}
}
问题来了:这个 JSON 结构是不规则的——
- 有些事件没有
device字段 - 有些
properties里有discount,有些没有 tags数组长度不固定- 不同批次导出的字段可能完全不同
传统 Python 处理方式:
import json
results = []
with open('user_events.json') as f:
for line in f:
event = json.loads(line)
try:
results.append({
'event_id': event['event_id'],
'user_id': event['user_id'],
'product_name': event['properties']['product_name'],
'price': event['properties']['price'],
# 如果某个字段缺失,直接 KeyError
})
except KeyError as e:
print(f"Missing key: {e}") # 然后手动处理几百个 KeyError
代码量巨大,维护成本极高,而且性能极差——10 万条数据可能要跑 8 秒以上。
二、DuckDB 方案:一行 SQL 搞定
2.1 直接读取,自动推断 Schema
DuckDB 内置了强大的 JSON 读取能力,read_json_auto 会自动推断 schema:
import duckdb
con = duckdb.ATTACH ("ecommerce.db")
# 直接读取 JSON 文件,自动推断结构
con.execute("""