DuckDB读取xlsx格式数据的方法比较
1.安装插件
a. DuckDB官方excel插件
b. 社区sheetreader插件,最高只适配到duckdb 1.2.2版本
2.数据准备
a. polars自带的foods.csv转成的foods.xlsx
b. 如下python代码生成带日期格式、小数格式的sale.txt
要求预先安装pandas,duckdb,openpyxl模块
import duckdb
duckdb.sql("""
create table sale(s_name varchar,s_date date,good_id int,
v1 decimal(15,2),
v2 decimal(15,2),
v3 decimal(15,2),
v4 decimal(15,2),
v5 decimal(15,2),
v6 decimal(15,2),
v7 decimal(15,2),
v8 decimal(15,2),
v9 decimal(15,2),
v10 decimal(15,2),
v11 decimal(15,2),
v12 decimal(15,2),
v13 decimal(15,2),
v14 decimal(15,2),
v15 decimal(15,2),
v16 decimal(15,2),
v17 decimal(15,2),
v18 decimal(15,2),
v19 decimal(15,2),
v20 decimal(15,2),
);
""")
duckdb.sql("""
insert into sale select 'sale'||i,date'2020-10-10'+i::int,i,
i*0.1*1,i*0.1*2,i*0.1*3,i*0.1*4,i*0.1*5,i*0.1*6,i*0.1*7,i*0.1*8,i*0.1*9,i*0.1*10,
i*0.1*11,i*0.1*12,i*0.1*13,i*0.1*14,i*0.1*15,i*0.1*16,i*0.1*17,i*0.1*18,i*0.1*19,i*0.1*20
from range(20)t(i);
""")
df0=duckdb.sql("from sale").to_df()
df0.to_excel("pysale20.xlsx",index=False)
c.社区sheetreader插件同一个团队开发的postgresql插件中的示例lineitem.xlsx文件。
d.利用excel插件对tpch基准lineitem表生成的exli2.xlsx文件。
3.读取功能测试
a. excel读取4种文件都能成功。
b. sheetreader读取第一、第三种成功,第二、第四种失败,报错。
D from sheetreader('pysale20.xlsx');
Binder Error:
Inline & dynamic String types not supported yet
4.性能测试
因为人造的xlsx文件某些插件无法读取,在网上找了个现成的纽约车管所数据。
这个数据excel插件反而读取不了,等找到一个大家都能读的数据集再测。
结论,xlsx文件格式太复杂,数据类型繁多,做到兼容很难。