复制用双引号括起来的 Redshift Pipe Delimited

Posted

技术标签:

【中文标题】复制用双引号括起来的 Redshift Pipe Delimited【英文标题】:Copy Redshift Pipe Delimited enclosed by double Quotes 【发布时间】:2020-01-26 16:35:07 【问题描述】:

我正在尝试将文件从 S3 加载到 Redshift。文件用 Pipe 分隔,但有包含 Pipe 和其他特殊字符的 value,但如果 value 有 Pipe,则用双引号括起来。

示例: Field1|Field2 "abc|dh"|123 efh@ih|233

我已尝试使用以下命令,但我收到错误说无效数字。这是由于复制命令将值中的管道视为分隔符。

copy table from 's3' iam_role 'arn' region 'us-east-1' MAXERROR AS 10 NULL AS '(null)' 'ESCAPE "' IGNOREHEADER AS 1 DELIMITER '|' timeformat 'auto' GZIP;

【问题讨论】:

【参考方案1】:

您正在寻找REMOVEQUOTES 参数。 https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-conversion.html#copy-removequotes

ESCAPE 要求您的数据准备好嵌入转义字符。例如,如果您的转义字符是 \,那么您需要准备数据,以便内容是 "abc\|dh"

例子:

DROP TABLE IF EXISTS public.quote_test; 
CREATE TABLE IF NOT EXISTS public.quote_test (col_a VARCHAR(10), col_b VARCHAR(10)); 
SELECT * FROM quote_test;
echo '"a|b"|"c|d"' > ~/simple_quotes.txt
aws s3 cp ~/simple_quotes.txt s3://my-bucket/simple_quotes.txt
--Will fail
COPY quote_test FROM 's3://my-bucket/simple_quotes.txt' 
CREDENTIALS 'aws_iam_role=arn:aws:iam::012345678901:role/redshift-cluster'
DELIMITER '|' REGION 'us-west-2';

--Succeeds with REMOVEQUOTES
COPY quote_test FROM 's3://benchmark-files/simple_quotes.txt' 
CREDENTIALS 'aws_iam_role=arn:aws:iam::012345678901:role/redshift-cluster'
REMOVEQUOTES DELIMITER '|' REGION 'us-west-2';

SELECT * FROM quote_test;
--  col_a | col_b
-- -------+-------
--  a|b   | c|d

【讨论】:

以上是关于复制用双引号括起来的 Redshift Pipe Delimited的主要内容,如果未能解决你的问题,请参考以下文章

json文件中的“期望用双引号括起来的属性名称”

Python/Json:期望用双引号括起来的属性名称

使用 Jenkins 管道上的 AWS cli “期望用双引号括起来的属性名称”

JSON的键究竟需要用双引号括起来吗

Pig — 如何加载包含用双引号括起来并用逗号分隔的字段的 CSV 文件

opencsv写入时去掉双引号