You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redshift UNLOAD后COPY出现乱码:格式解析与解决问询

问题解答

一、数据格式是什么?

你通过UNLOAD命令指定了FORMAT PARQUET,导出的文件是Parquet格式——这是一种二进制列式存储格式,并非纯文本结构,直接以文本方式解析就会显示成你看到的乱码内容。

二、乱码出现的原因

核心问题是导出与导入的格式不匹配:

  • UNLOAD生成的是二进制Parquet文件,不是纯文本CSV
  • COPY命令指定了CSV格式,Redshift会把二进制Parquet文件当作纯文本CSV来解析,自然会读出一堆无意义的乱码字符

三、解决办法(含乱码行处理方案)

方案1:修正COPY命令,匹配Parquet格式(推荐)

这是最根本的解决方式,让COPY命令正确识别Parquet格式,无需处理乱码:

COPY core.go_prod_session_backup
FROM '<path>'
iam_role '<some role>'
FORMAT PARQUET;

由于你的UNLOAD命令使用了MANIFEST参数,需要指向manifest文件并添加对应选项:

COPY core.go_prod_session_backup
FROM '<path>/manifest' -- 替换为实际manifest文件路径
iam_role '<some role>'
FORMAT PARQUET
MANIFEST;

方案2:重新导出为CSV格式(若业务需要CSV)

如果场景必须使用CSV格式,修改UNLOAD命令导出CSV后,再用CSV格式执行COPY:

UNLOAD (
    'SELECT es.user_id,
       NULL::"unknown"           AS event_id,
       es."timestamp" AS es_ts,
       es.session_id,
       NULL::"unknown"           AS referrer_id
    FROM es
    WHERE es."timestamp" < \'2023-08-15 00:00:00\'::timestamp without time zone'
)
TO '<some_path>'
iam_role '<some role>'
FORMAT CSV MANIFEST ALLOWOVERWRITE PARALLEL ON MAXFILESIZE 1024 MB;

方案3:临时跳过乱码行(仅应急,不推荐)

如果必须强行用当前错误格式导入(不建议,会丢失大量有效数据),可通过COPY参数跳过错误行:

  • MAXERROR <n>:允许最多n条错误行,超过才终止导入
  • IGNOREHEADER <n>:跳过开头n行(若乱码集中在文件头部)

示例命令:

COPY core.go_prod_session_backup
FROM '<path>'
iam_role '<some role>'
CSV
MAXERROR 100; -- 允许最多100条错误行

注意:这种方式只是跳过解析失败的行,本质还是错误解析Parquet文件,大部分有效数据会被判定为错误行跳过,仅适合临时应急场景。


内容的提问来源于stack exchange,提问作者Jwan622

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:22:19