查看原文
其他

DuckDB批量转CSV为Parquet

alitrack alitrack 2022-10-01

Why DuckDB系列:


昨天文章里提到的AirOnTimeCSV.zip包含了303个csv文件,使用Spark可以方便地将它们转为parquet存储,如果不巧你不熟悉Spark,那也没有关系,试试DuckDB的强大功能。

DuckDB支持输出csv和parquet,代码如下,

copy (select * from tbl) to 'tbl.parquet' (format 'parquet')copy (select * from tbl) to 'tbl.csv' (format 'csv')


所以单个csv转parquet可以这样实现,

copy (select * from read_csv_auto('AirOnTimeCSV/airOT200103.csv')) to'airOT200103.parquet' (format 'parquet')


那AirOnTimeCSV有303个,怎么办?


脚本实现


借助Python很容易实现(昨天的代码里已经有范例),今天介绍下纯脚本的实现,


for i in *.csvdo base=$(basename "$i" .csv) echo "copy (select * from read_csv_auto('$i')) to '$base.parquet' (format 'parquet');"done


将上面代码保存为csv2parquet,并执行下面命令生成c2p.sql文件


bash csv2parquet>c2p.sql


然后DuckDB执行如下代码

duckdb <c2p.sql

等待303个parquet的生成。


注意事项


目前duckdb仅仅支持UTF8格式,如果不是,需要自行转为UTF8, 关于编码问题,可以参考编码的烦恼以及这两款软件可以解决你大部分编码的烦恼


另外你下载的AirOnTimeCSV.zip 解压缩时,如果报错,可以尝试使用最新版本的zip进行修复

$ zip -FF AirOnTimeCSV.zip --out AirOnTimeCSV_fixed.zip

具体可以参考https://zhuanlan.zhihu.com/p/264979402

修复后解压缩的airOT200103.csv建议使用iconv转编码

mv airOT200103.csv airOT200103.csv.1#macOSiconv -f ISO-8859-1 -t UTF-8 airOT200103.csv.1>airOT200103.csv
# Linuxiconv -f ISO-8859-1 -t UTF-8 airOT200103.csv.1 -o airOT200103.csv


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存