跳到主要内容

CSV 导入技巧

下面汇总了一些导入复杂 CSV 文件时的实用技巧。示例均使用 flights.csv

表头识别不正确时覆盖 header 标志

如果文件只包含字符串列,header 自动检测可能失败。此时可显式设置 header 覆盖该行为。

SELECT * FROM read_csv('flights.csv', header = true);

文件无表头时手动提供列名

若文件没有表头,默认会自动生成列名。你可以通过 names 选项提供自定义列名。

SELECT * FROM read_csv('flights.csv', names = ['DateOfFlight', 'CarrierName']);

覆盖指定列类型

types 可通过 nametype 的结构体映射,仅覆盖部分列的类型。

SELECT * FROM read_csv('flights.csv', types = {'FlightDate': 'DATE'});

向表加载数据时优先使用 COPY

COPY 语句可将数据直接复制到表中。此时 CSV 读取器会使用表的 schema,而非从文件自动检测类型。这样既更快,也能减少自动检测误判。

COPY tbl FROM 'test.csv';

加载不同 Schema 文件时使用 union_by_name

union_by_name 可统一不同 schema(或缺列)文件的列结构。对于缺失的列,会自动填充 NULL

SELECT * FROM read_csv('flights*.csv', union_by_name = true);

若要把数据加载到已有表,且该表列数多于 CSV 文件列数,可使用 INSERT INTO ... BY NAME 子句

INSERT INTO tbl BY NAME
SELECT * FROM read_csv('input.csv');

样本大小

如果 CSV sniffer 没有识别出正确类型,尝试增大样本大小。 sample_size = -1 会强制 sniffer 读取整个文件:

SELECT * FROM read_csv('my_csv_file.csv', sample_size = -1);