Featured image of post DuckDB 处理不规则 JSON 数据:从\

DuckDB 处理不规则 JSON 数据:从"解析到崩溃"到 5 分钟出结果

业务方甩来几万行嵌套 JSON 文件?别再用 Python 逐行解析了。DuckDB 一行 SQL 自动推断 schema,3 秒出结构化数据,附完整代码和性能对比。

DuckDB 处理不规则 JSON 数据:从"解析到崩溃"到 5 分钟出结果

场景引入:那个让数据分析师失眠的 JSON 文件

你有没有遇到过这种场景:

周一早上,业务方甩给你一个 JSON 文件,说"里面是用户行为数据,帮我把里面的关键指标提取出来做分析"。你打开一看——好家伙,几万行嵌套 JSON,字段还不一样,有的有 user_id,有的没有,有的嵌套了三层,有的数组里还套着对象。

用 Python 逐行解析?代码写了半天,跑起来还报 KeyError。用 Pandas 读?直接 OOM 内存溢出。用 Excel 打开?电脑直接卡死。

这就是"不规则 JSON"(Ragged JSON)的经典困境——每条记录的字段结构不一致,传统方法处理起来极其痛苦。

但如果你用 DuckDB,这一切可以在 5 分钟内搞定。

DuckDB JSON 不规则数据处理架构

一、真实场景:电商平台的用户行为日志

假设你有一个 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("""

📺 Watch video tutorials → Olap Studio YouTube

Subscribe for more DuckDB & AI automation tutorials

使用 Hugo 构建
主题 StackJimmy 设计

⚠️ 本站为独立社区项目,与 DuckDB 基金会及 DuckDB 官方项目无任何从属、背书或赞助关系。

"DuckDB" 是 DuckDB 基金会的注册商标,本站仅以事实描述方式使用该名称。

本站内容仅供教育与社区推广用途,不构成任何商业服务。