首页 > 解决方案 > 使用包含阿拉伯文本的数据行复制 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 中配置什么来接受这个阿拉伯文本,这样记录的结尾就不会损坏?

谢谢

标签: snowflake-cloud-data-platform

解决方案


我不是雪花专家,但我已经使用过它并且我调试过很多这样的问题。

我最初关于为什么您会收到意外的 EOR(即 \n)是因为您的数据包含 \n。如果您的数据有 \n 那么在读取数据时这将看起来像一个 EOR。我不相信有办法在 Redshift UNLOAD 命令中更改 EOR。因此,您需要在 Redshift UNLOAD 命令中进行 ESCAPE 以在 \n 等字符之前添加反斜杠。您还需要告诉 Snowflake 转义字符是什么 - ESCAPE = '\' (我认为您需要在此语句中使用双反斜杠)。[您可能还需要引用您的字段,但您会知道,当您遇到任何隐藏在此字段中的问题时。]

另一种方法是使用不同的卸载格式,它不会受到重载字符含义的影响。

问题可能在于与您的阿拉伯语文本相关的字符编码,但我预计不会,因为 Redshift 和 Snowflake 都是基于 UTF-8 的系统。可能但不太可能。


推荐阅读