文本栏中的隐藏字符可防止UNLOAD&红移时复制

时间:2016-08-19 21:56:12

标签: sql postgresql amazon-redshift

使用UNLOAD将数据导入我通过COPY导出的redshift实例失败:

Delimiter not found

查看数据很清楚原因:

"full_url"|"http://www.blahblah.com/about.html?....%2F%2Fetc%2Fpasswd\\|"w4NrxtSqsSJ7B6U3Nv2I8SP9300="|"2016-08-17 16:03:08"

请注意,“passwd \”

后面没有双引号

当我从db

中查询这些特定行时
> SELECT value, len(value) FROM property WHERE id=1232323

                       value                              | len
----------------------------------------------------------+-------
http://www.blahblah.com/about.html?....%2F%2Fetc%2Fpasswd | 58

它表示len是58,但如果计算该字符串的长度,则实际上是57个字符。我相信在这个字符串的末尾有一些不可显示的字符阻止redshift在UNLOAD上正确地转义字符串。

我还尝试手动将引号字符作为查询的一部分,它不起作用,它只是字面上删除了引号字符。

有谁知道如何加载这些数据?丢失行或更改数据我很好。

供参考,以下是我用于UNLOAD和COPY的命令:

UNLOAD:

UNLOAD ('
SELECT
     p.name as name,
     p.value as value,
     p.event_id as event_id,
     e.created_server_ts
FROM
     property p
     JOIN event e ON p.event_id=e.id
')
TO 's3://bucket/data'
WITH CREDENTIALS 'aws_access_key_id=<KEY>;aws_secret_access_key=<SECRET>'
ESCAPE ADDQUOTES GZIP MANIFEST;

COPY:

copy property
from 's3://bucket/data' credentials
'aws_access_key_id=<KEY>;aws_secret_access_key=<SECRET>'
escape removequotes gzip manifest ACCEPTINVCHARS as '^';

由于某些行总是失败:

1 个答案:

答案 0 :(得分:1)

如果您可以放弃有问题的行,可以将MAXERROR运算符添加到语句中。只要坏记录的数量不超过您指定的值MAXERROR,负载就会成功。

以下是一个例子:

COPY property
FROM 's3://bucket/data' credentials
'aws_access_key_id=<KEY>;aws_secret_access_key=<SECRET>'
ESCAPE REMOVEQUOTES GZIP MANIFEST ACCEPTINVCHARS as '^' MAXERROR 500000;

但在丢弃行之前,找出导致问题的违规字符会很有趣。也许运行如下命令:

SELECT p.value, CHAR(RIGHT(p.value,1)) ad ASCII_CODE
FROM property p
WHERE p.id=1232323

然后,一旦你知道了有问题的字符,就可以在你的UNLOAD中创建一个解决问题的语句。

相关问题