我经常需要将csv导入postgres,并且通常使用\copy
中的psql
命令。它通常看起来像这样
\copy tbl FROM import.csv CSV
我有两个常见的问题,我觉得可能有类似的答案。
TIMESTAMP
字段INTEGER
字段中的空字符串在这两种情况下都需要进行少量修改,但我目前的解决方案是创建所有字段为VARCHAR
的加载表,然后创建具有正确模式的另一个表。然后我使用\copy
和
CREATE TABLE loading_tbl (
datefield VARCHAR,
integerfield VARCHAR
);
CREATE TABLE tbl (
datefield TIMESTAMP,
integerfield INTEGER
);
\copy loading_tbl FROM import.csv CSV
INSERT INTO tbl (datefield, integerfield)
SELECT
to_timestamp(datefield, 'YYYY-Mon, DAY HH24:MI a.m'),
integerfield::INTEGER
FROM loading_tbl;
DROP TABLE loading_tbl;
这是最好的方法还是有更简单的方法?创建两个表是一种痛苦,特别是当字段数增加时。
答案 0 :(得分:0)
另一种选择是使用脚本语言来执行 ETL 。根据您的具体需求,可能更容易推理和/或减少开销。
例如,您可以使用 Python 的 csv 和 psycopg2 模块与 CSV进行交互 file和 Postgres 数据库,分别执行必要的 ETL 。 psycopg2 通常会将时间戳字符串处理为实际的 Postgres 时间戳转换(假设它是一个已识别的时间戳字符串,其中有多种类型)。
如果 CSV 中的字段是 Postgres 中的整数但 CSV 中的空字符串,则 Python 脚本,您可以检查空字符串值并将它们分配为 NULL ,而不是 Postgres 。
我最近使用 Python 来做这样的事情,结果很好。对问题解决方案的最大胜利可能是缺少需要过渡表,因为 ETL 可以在脚本中完成,然后通过<发送到 Postgres EM> psycopg2
如果您的 ETL 需要适度,即仅限于您在上面提供的示例,则可能值得坚持使用纯 SQL 。对此的一个增强是使用temp table
(对于loading_tbl
)而不是常规表。这样你就不用担心在 ETL 之后删除它了。