You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按行组/分块将Parquet文件导入DuckDB并创建表?

按行组分块加载Parquet文件到DuckDB

DuckDB原生支持直接读取Parquet文件的行组,无需通过Pandas全量加载,能更高效地处理文件并按行组分块导入。以下是两种可行的实现方案:

方案1:通过SQL直接按行组导入

DuckDB的parquet_scan函数支持指定row_groups参数读取特定行组,你可以循环遍历所有行组,逐组插入到目标表中:

import duckdb

# 连接数据库
con = duckdb.connect(database='database.duckdb', read_only=False)

# 先创建空表(从Parquet文件自动获取表结构)
con.execute("CREATE TABLE table1 AS SELECT * FROM parquet_scan('file1.parquet', row_groups=[0]) LIMIT 0")
con.execute("CREATE TABLE table2 AS SELECT * FROM parquet_scan('file2.parquet', row_groups=[0]) LIMIT 0")

# 获取Parquet文件的行组总数
def get_row_group_count(file_path):
    result = con.execute(f"SELECT count(*) FROM parquet_metadata('{file_path}')").fetchone()
    return result[0]

# 逐行组插入table1
row_group_count_1 = get_row_group_count('file1.parquet')
for rg in range(row_group_count_1):
    con.execute(f"INSERT INTO table1 SELECT * FROM parquet_scan('file1.parquet', row_groups=[{rg}])")

# 逐行组插入table2
row_group_count_2 = get_row_group_count('file2.parquet')
for rg in range(row_group_count_2):
    con.execute(f"INSERT INTO table2 SELECT * FROM parquet_scan('file2.parquet', row_groups=[{rg}])")

con.close()

方案2:Python层面分块读取行组并插入

如果需要在插入前对每块数据做自定义处理,可以用pyarrow读取Parquet行组,再逐块导入DuckDB:

import duckdb
import pyarrow.parquet as pq

con = duckdb.connect(database='database.duckdb', read_only=False)

# 处理file1.parquet
parquet_file = pq.ParquetFile('file1.parquet')
# 创建匹配结构的空表
con.execute("CREATE TABLE table1 AS SELECT * FROM parquet_scan('file1.parquet', row_groups=[0]) LIMIT 0")
# 逐行组读取并插入
for rg in range(parquet_file.num_row_groups):
    table = parquet_file.read_row_group(rg)
    con.execute("INSERT INTO table1 SELECT * FROM table")

# 处理file2.parquet
parquet_file = pq.ParquetFile('file2.parquet')
con.execute("CREATE TABLE table2 AS SELECT * FROM parquet_scan('file2.parquet', row_groups=[0]) LIMIT 0")
for rg in range(parquet_file.num_row_groups):
    table = parquet_file.read_row_group(rg)
    con.execute("INSERT INTO table2 SELECT * FROM table")

con.close()

关键说明

  • 避免全量加载:Pandas会将整个Parquet文件读入内存,对大文件不友好;直接用DuckDB或PyArrow读取行组能大幅降低内存占用。
  • parquet_metadata函数:DuckDB内置的元数据查询工具,可快速获取Parquet文件的行组数量。
  • 空表创建:通过LIMIT 0自动复用Parquet文件的字段结构,无需手动定义表结构。

内容的提问来源于stack exchange,提问作者Sushmitha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:05:21