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

DuckDB能否读取动态CSV文件集合?基于CSV路径表的实现疑问

DuckDB动态读取表中存储路径的CSV文件并合并

你的核心问题是:DuckDB的read_csv默认会把传入的参数当作字面量路径模式,而非引用表中的列值,所以直接传入列名会被当成文件路径字符串,导致找不到文件。以下是几种可行的解决方法:

方法1:使用LATERAL关联查询(推荐,需DuckDB v0.9.0+)

如果你的DuckDB版本是v0.9.0及以上,你最初的写法其实是可行的,旧版本不支持将列作为表函数参数传递才会报错。升级后直接执行以下语句即可:

SELECT *
FROM table_csv_paths AS csv_file,
LATERAL read_csv(csv_file.csv_file_path, union_by_name = true, AUTO_DETECT = TRUE) AS t_csv;

若仍报错,先确认:

  • CSV文件路径是否正确(绝对路径/相对路径需匹配DuckDB当前工作目录,可通过SELECT current_setting('current_directory');查看)
  • 路径字符串是否包含特殊字符,如有需确保转义正确

方法2:动态SQL拼接执行(兼容旧版本)

如果无法升级DuckDB,可以通过动态SQL拼接路径列表来批量读取:

-- 拼接路径为逗号分隔的字符串,执行动态查询
WITH paths AS (
    SELECT string_agg(concat('''', csv_file_path, ''''), ',') AS path_list
    FROM table_csv_paths
)
EXECUTE format('SELECT * FROM read_csv([%s], union_by_name = true, AUTO_DETECT = TRUE)', (SELECT path_list FROM paths));

或者通过列表聚合后执行:

WITH paths AS (
    SELECT list(csv_file_path) AS path_list
    FROM table_csv_paths
)
EXECUTE format('SELECT * FROM read_csv($1, union_by_name = true, AUTO_DETECT = TRUE)', (SELECT path_list FROM paths));

方法3:Unnest路径列表后读取

先将路径聚合为列表再展开,逐个读取文件:

SELECT *
FROM unnest((SELECT list(csv_file_path) FROM table_csv_paths)) AS paths(file_path),
LATERAL read_csv(paths.file_path, union_by_name = true, AUTO_DETECT = TRUE);

注意事项

  • 确保所有CSV文件的字段可以通过union_by_name正确合并,若字段类型不匹配需提前处理
  • 路径中若包含空格或特殊字符,需用单引号包裹保证转义正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 12:23:10