其他
DuckDB批量转CSV为Parquet
Why DuckDB系列:
DuckDB批量转CSV为Parquet
昨天文章里提到的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 *.csv
do
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
#macOS
iconv -f ISO-8859-1 -t UTF-8 airOT200103.csv.1>airOT200103.csv
# Linux
iconv -f ISO-8859-1 -t UTF-8 airOT200103.csv.1 -o airOT200103.csv