数据字符串中具有分隔符/特殊字符的 Redshift 卸载命令

Posted

技术标签:

【中文标题】数据字符串中具有分隔符/特殊字符的 Redshift 卸载命令【英文标题】:Redshift Unload Command having delimiter/Special Characters in Data String 【发布时间】:2020-07-09 13:43:29 【问题描述】:

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

INSERT INTO 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('从 my_schema.my_table 中选择 *') 到 '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,我将获得列中的确切数据。

【问题讨论】:

【参考方案1】:

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

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

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

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

希望对你有帮助

【讨论】:

感谢比尔的方法。但我设法在卸载命令中仅使用“ESCAPE”关键字,然后进一步对生成的 csv 进行转换以获得所需的结果。

以上是关于数据字符串中具有分隔符/特殊字符的 Redshift 卸载命令的主要内容,如果未能解决你的问题,请参考以下文章

如何解析iOS中具有特殊字符的xml数据?

JavaScript中url 传递参数(特殊字符)解决方法

JsonConvert.DeserializeObject 特殊字符 未终止的字符串。预期的分隔符:

URL中的特殊字符

将按字符串分隔的组件添加到具有核心数据的谓词中

如何在 MongoDB 中查找具有特殊字符的数据