Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将大型数据集加载到postgresql时写入错误文件_Postgresql - Fatal编程技术网

将大型数据集加载到postgresql时写入错误文件

将大型数据集加载到postgresql时写入错误文件,postgresql,Postgresql,加载大文件时,是否可以在加载其余数据时将错误重定向到错误文件 我使用copy命令将大约4 Gig的数据加载到postgresql中。数据是由来自不同来源的数百个文件生成的,这意味着数据可能非常嘈杂。规范化数据大约需要一个小时,每次出现错误时,我必须等待修复错误,然后等待一个小时。这根本不起作用 是否有一种方法可以加载尽可能多的数据,并将错误消息写入文件,或者甚至在检测到错误后在整个文件中运行psql copy的验证逻辑?否,PostgreSQL在复制期间不提供错误处理。这是一个经常被要求的特性,

加载大文件时,是否可以在加载其余数据时将错误重定向到错误文件

我使用copy命令将大约4 Gig的数据加载到postgresql中。数据是由来自不同来源的数百个文件生成的,这意味着数据可能非常嘈杂。规范化数据大约需要一个小时,每次出现错误时,我必须等待修复错误,然后等待一个小时。这根本不起作用


是否有一种方法可以加载尽可能多的数据,并将错误消息写入文件,或者甚至在检测到错误后在整个文件中运行psql copy的验证逻辑?

否,PostgreSQL在
复制期间不提供错误处理。这是一个经常被要求的特性,但由于内部设计/架构的原因,这不是一个容易实现的特性,
COPY
的性能可能会受到严重影响。未来的版本可能提供
复制
过滤器,但可能不提供逐行错误处理

相反,
COPY
将数据复制到一个
临时的
未标记的
表中,然后使用SQL将其插入到真正的目标表中,并使用适当的过滤器检测坏数据,方法如下:

INSERT INTO real_table(col1, col2, col3)
SELECT 
   col1,
   col2,
   col3
FROM temp_table
WHERE ... validation clauses ...
这只有在待复制的文件整体格式良好时才有帮助,因为
复制
自身结构或数据类型表示中的错误仍然会导致加载失败。只有当您能够有效地预测哪些数据将导致错误时,它才有用。如果您无法预测失败,可以使用PL/PgSQL函数和
BEGIN。。。异常
子句从临时表传输数据,但由于循环和为每行设置子事务,这会对性能造成很大影响

如果您有格式错误的类型(即
datein
将拒绝的日期),您可以
将整个数据流复制到一个表中,该表包含
文本
列,用于可疑输入。然后进行验证。但是,如果您的输入在结构上存在错误,这将不会有帮助-错误的引用/转义,某些行上的列太多,等等


如果您的数据真的很困难,我强烈建议您使用合适的ETL工具,如Pentaho Kettle或Talend Studio。他们需要更多的学习,但他们更善于吸收不良数据。还有<代码> PGYBulkLoad 作为一个选项,虽然我不知道它是如何保持的。

< P>不,PostgreSQL不提供错误处理,在<代码>拷贝< /C>。这是一个经常被要求的特性,但由于内部设计/架构的原因,这不是一个容易实现的特性,
COPY
的性能可能会受到严重影响。未来的版本可能提供
复制
过滤器,但可能不提供逐行错误处理

相反,
COPY
将数据复制到一个
临时的
未标记的
表中,然后使用SQL将其插入到真正的目标表中,并使用适当的过滤器检测坏数据,方法如下:

INSERT INTO real_table(col1, col2, col3)
SELECT 
   col1,
   col2,
   col3
FROM temp_table
WHERE ... validation clauses ...
这只有在待复制的文件整体格式良好时才有帮助,因为
复制
自身结构或数据类型表示中的错误仍然会导致加载失败。只有当您能够有效地预测哪些数据将导致错误时,它才有用。如果您无法预测失败,可以使用PL/PgSQL函数和
BEGIN。。。异常
子句从临时表传输数据,但由于循环和为每行设置子事务,这会对性能造成很大影响

如果您有格式错误的类型(即
datein
将拒绝的日期),您可以
将整个数据流复制到一个表中,该表包含
文本
列,用于可疑输入。然后进行验证。但是,如果您的输入在结构上存在错误,这将不会有帮助-错误的引用/转义,某些行上的列太多,等等


如果您的数据真的很困难,我强烈建议您使用合适的ETL工具,如Pentaho Kettle或Talend Studio。他们需要更多的学习,但他们更善于吸收不良数据。还有<代码> PGYBulkLoad 作为一个选项,虽然我不知道它是如何保持的。

< P>不,PostgreSQL不提供错误处理,在<代码>拷贝< /C>。这是一个经常被要求的特性,但由于内部设计/架构的原因,这不是一个容易实现的特性,
COPY
的性能可能会受到严重影响。未来的版本可能提供
复制
过滤器,但可能不提供逐行错误处理

相反,
COPY
将数据复制到一个
临时的
未标记的
表中,然后使用SQL将其插入到真正的目标表中,并使用适当的过滤器检测坏数据,方法如下:

INSERT INTO real_table(col1, col2, col3)
SELECT 
   col1,
   col2,
   col3
FROM temp_table
WHERE ... validation clauses ...
这只有在待复制的文件整体格式良好时才有帮助,因为
复制
自身结构或数据类型表示中的错误仍然会导致加载失败。只有当您能够有效地预测哪些数据将导致错误时,它才有用。如果您无法预测失败,可以使用PL/PgSQL函数和
BEGIN。。。异常
子句从临时表传输数据,但由于循环和为每行设置子事务,这会对性能造成很大影响

如果您有格式错误的类型(即
datein
将拒绝的日期),您可以
将整个数据流复制到一个表中,该表包含
文本
列,用于可疑输入。然后进行验证。但是,如果您的输入在结构上存在错误,这将不会有帮助-错误的引用/转义,某些行上的列太多,等等

如果您的数据真的很困难,我强烈建议您使用合适的ETL工具,如Pentaho Ket