使用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 '^';
由于某些行总是失败:
答案 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中创建一个解决问题的语句。