snowflake-cloud-data-platform - 使用包含阿拉伯文本的数据行复制 S3 文件会导致记录结束并且复制失败
问题描述
我将一张表从 Redshift 卸载到 S3。该表有 212 列宽。某些行中的某些字段包含阿拉伯语文本。
这是我使用的 Redshidt Unload 命令:
unload ('select * from dataw.testing')
to 's3://uarchive-live/rpt_all/rpt_all.txt'
iam_role 'arn:aws:iam::12345678988:role/service-role'
GZIP
DELIMITER '\t'
null as ''
;
当我尝试将此文件复制到雪花中时,会发生错误。
记录结束,而预期解析列 '"RPT_ALL"["AUTO_TRAF_RETR_CNT":211]' 文件 'rpt_all_250/rpt_all.txt0000_part_113.gz',第 9684 行,字符 1187 第 9684 行,列 "RPT_ALL"["AUTO_TRAF_RETR_CNT":211 ]
错误中引用的字段名称不是记录中的最后一个字段,在该字段之后还有两个。
我从字段中删除了阿拉伯文本并将它们留空,然后我再次尝试复制,这次复制没有错误。
这是我正在使用的雪花文件格式:
CREATE FILE FORMAT IF NOT EXISTS "DEV"."PUBLIC"."ff_noheader" TYPE = 'CSV' RECORD_DELIMITER = '\n' FIELD_DELIMITER = '\t' SKIP_HEADER = 0 COMPRESSION = 'GZIP' TIMESTAMP_FORMAT = 'AUTO' TRIM_SPACE = TRUE REPLACE_INVALID_CHARACTERS = TRUE;
这是我正在使用的雪花复制命令:
COPY INTO "DEV"."PUBLIC"."RPT_ALL" FROM @"stg_All"/snowflk_test.csv FILE_FORMAT="DEV"."PUBLIC"."ff_noheader";
我需要在 Snowflake 中配置什么来接受这个阿拉伯文本,这样记录的结尾就不会损坏?
谢谢
解决方案
我不是雪花专家,但我已经使用过它并且我调试过很多这样的问题。
我最初关于为什么您会收到意外的 EOR(即 \n)是因为您的数据包含 \n。如果您的数据有 \n 那么在读取数据时这将看起来像一个 EOR。我不相信有办法在 Redshift UNLOAD 命令中更改 EOR。因此,您需要在 Redshift UNLOAD 命令中进行 ESCAPE 以在 \n 等字符之前添加反斜杠。您还需要告诉 Snowflake 转义字符是什么 - ESCAPE = '\' (我认为您需要在此语句中使用双反斜杠)。[您可能还需要引用您的字段,但您会知道,当您遇到任何隐藏在此字段中的问题时。]
另一种方法是使用不同的卸载格式,它不会受到重载字符含义的影响。
问题可能在于与您的阿拉伯语文本相关的字符编码,但我预计不会,因为 Redshift 和 Snowflake 都是基于 UTF-8 的系统。可能但不太可能。
推荐阅读
- recursion - 使用简单递归从未排序列表中构建二叉搜索树
- api - 使用 MS Graph Rest APi 将文件上传到文档集
- android - leftOf / endOf 不应该像编程方式(RelativeLayout)Android中的xml一样工作
- qt - 使用新的铬版本构建 WebEngine 5.15.2
- javascript - adobe jsx 设置填充和描边在脚本完成之前不会更新
- c# - 忽略正则表达式搜索中的模式错误,不要使搜索崩溃
- youtube-api - 1 个帐户上的多个 Youtube 频道。如何将提供的 API 密钥限制为仅 1 个通道?
- python - 如何根据输入列表中的项目数更改 URL
- iframe - 如何防止用户使用沙盒 iframe (jwplayer)
- python - 将 Pandas 日期时间转换为 Postgres 日期