如何按行组/分块将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
相关产品推荐
相关产品推荐

