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
相关产品推荐
相关产品推荐

