首页 > 解决方案 > 数据字符串中具有分隔符/特殊字符的 Redshift 卸载命令

问题描述

我正在尝试将数据从 Redshift 卸载到 csv 中的 S3。然后将此 csv 数据转换为带有所需参数的 json 消息。它适用于普通数据列,但是当数据列包含分隔符或特殊字符时,生成的 csv 文件的映射不正确。我正在使用“|” 卸载命令中的分隔符,如果“|” 分隔符出现在任何数据字符串中,然后它会弄乱 csv。例如,如果数据是:

插入 my_schema.my_table (atr_id, atr_dt, atr_name, atr_array_name, atr_array_float, atr_array_bool) VALUES('2987', '2015-06-28 05:07:00.000', 'name', '["|name1", "name2 "]', '[1.2, 1.3]', '[true, false]');

卸载命令:

unload('select * from my_schema.my_table') to 's3://my-bucket/filename' iam_role 'arn:aws:iam::888555888:role/my-bucket-role' DELIMITER AS '|' addquotes 转义 HEADER ALLOWOVERWRITE 并行关闭;

然后生成 csv:

atr_array_boolean|atr_array_float|atr_array_name|atr_dt|atr_id [true, false]|[1.2, 1.3]|["|name1", "name2"]|2015-06-28 05:07:00|1987

如何添加更多特殊字符来转义即{}、[]、分隔符等?因此,一旦我处理此 CSV,我将获得列中的确切数据。

标签: amazon-web-servicescsvamazon-s3amazon-redshift

解决方案


因此,您遇到了通用字符分隔文件(TSV、PSV 或简单的逗号分隔值)与指定 CSV 之间的差异 - 请参阅https://www.rfc-editor.org/rfc/rfc4180

当人们的数据中有逗号时,最简单的做法是将分隔符更改为不在数据中但没有指定转义过程的内容。如果您想走这条路,您可以将分隔符更改为数据中不存在的内容,例如 ascii 钟字符。然后读取文件的任何内容都需要使用此分隔符。

另一种方法是使用 Redshift 卸载功能来匹配 CSV 规范。您将需要“格式 CSV 添加引号转义”,但不要更改分隔符,因为转义参数不知道转义您选择的任何随机分隔符。我认为这是您遇到问题的地方- | 在数据中被视为分隔符。

现在要完整了,我相信 Redshift 会将双引号转义为规范所述的“不是”,但大多数工具都可以使用。

希望这可以帮助


推荐阅读