0

我喜欢这个功能: CREATE VIEW ontime AS SELECT * FROM read_csv_auto('test.csv'); 但注意到它无法正确识别加载大型 csv 文件的列类型,并且无法读取不适合已识别列类型的行。csv阅读器用来决定列类型的默认行数是多少?是否可以调整这些行的数量?

4

1 回答 1

2

csv阅读器用来决定列类型的默认行数是多少?

当前行为是对 10 个 100 行的块进行采样。它可以进一步分为两种情况。

  1. 文件有 ~ 1000 行或更少(或被压缩):块被采样,中间没有间隙(即考虑到第一个最大 1000 行)
  2. 文件有 >> 1000 行:前 100 行被采样,另外 9 个等距的 100 行块从整个文件中采样。

在这两种情况下,前 100 行将创建一个初始类型猜测,该猜测将检查与后续块的一致性。如果类型不匹配,则相应地修改猜测。

尽管如此,类型猜测仍然存在理论上(和实际)的可能性。假设一个有 1.000.000 行的文件有一列恰好包含 1000 个字符串值和 999.000 个整数值。假设字符串值是随机分布的,样本块不包含任何字符串值 ((1-(1000/1000000))^1000=0.367..) 的可能性约为 36.7%。在这种情况下,类型猜测器会建议为该列输入整数,而解析器将阻塞第一个字符串值。在这一点上修改猜测是明智的(例如 h2oai/datatable 实现是在datatable/reader_fread.cc中进行的)。但是这种行为目前(v.0.2)尚未在duckdb中实现。

推荐的解决方法是使用duckdb read_csv 函数并手动定义模式/数据类型。请参阅此处的COPY 语句部分:DuckDB Docs - CSV Loading

是否可以调整这些行的数量?

每个块的行数在源代码中定义,请参见duckdb/buffered_csv_reader.hpp,第 15 行。如果要更改数字,则必须从源代码构建 duckdb(这实际上非常简单)。但是,块大小不能大于标准向量大小,默认为 1024。尽管如此,我认为将块大小和样本块的数量作为选项公开给用户是可行的,我们可以考虑在未来的版本中做这样的事情。另一种选择是自动设置相对于文件中总行数的样本块数。谢谢你的问题。

于 2020-08-04T21:47:03.840 回答