将 parquet 文件复制到 Redshift 时出错,在一列中包含逗号分隔的数据

问题描述 投票:0回答:2

我正在尝试将位于 S3 中的 parquet 文件复制到 Redshift,但由于一列包含逗号分隔的数据而失败。有谁知道如何处理镶木地板文件中的这种情况?

文件中的示例 Parquet 数据

"column_1" : "data1"
"column_2" : "data2"
....
"column_16" : "test1, test2"

特定列中的数据以逗号分隔,值为“test1,test2”

Redshift 复制命令

COPY schema.table_name
FROM 's3://path/to/parquetfiles/'
IAM_ROLE 'iam_role'
FORMAT AS PARQUET

错误

错误:频谱扫描错误详细信息:---------------------------------------- ----- 错误:频谱扫描错误代码:15007 上下文:表和文件之间的列数不匹配。表列:20,数据列:21,文件名:https://s3-path.snappy.parquet查询:1212221位置:dory_util.cpp:1445进程:worker_thread [pid = 21520] ------ ------------------------------------------ [错误ID: 1-63864993-580523e75d18ashsd88894

我尝试使用 ACCEPTINVCHARS 但它似乎无法处理这种情况。

期望将column_16中的数据原样复制

column_16
"test1,test2"
sql amazon-web-services amazon-s3 amazon-redshift
2个回答
0
投票

如果出现此类问题,请在此处为其他任何人发布答案。

问题是镶木地板文件总共有 21 列。

  • 当我通过 S3 select 查询镶木地板文件并查看 JSON 格式的镶木地板文件数据时,它只向我显示 20 列(因为 1 列具有 NULL 值),但镶木地板文件的 JSON 输出没有向我显示该列

  • 当我通过 PySpark 查询 parquet 文件时,我能够在 parquet 文件中看到这 21 列/数据。如果某些列具有 NULL 值,则数据在镶木地板中被标记为“无”。

当我创建包含 21 列的红移表并尝试执行 COPY to REDSHIFT 时,它仍然给出相同的光谱错误。作为临时解决方案,我针对它运行了 Glue 爬虫,Glue 爬虫能够获取所有 21 列,并在数据为 NULL 的地方添加 NULL,但直接 COPY 到 REDSHIFT 无法处理它。我不是 100% 确定,但 REDSHIFT COPY 问题似乎是它无法从镶木地板文件中读取/识别 NULL 值列并引发错误。

作为最终的解决方案,在我的 PySpark 代码中,我转储了 21 列的结果(就像以前一样),但不是将“NULL”或“无”值插入为空白(双引号 - “”),只要给定的列没有里面的数据。此外,尝试将 NULL 值作为“”(双引号)的新结果复制到 REDSHIFT,并且复制成功


0
投票

对于其他遇到此错误的人,我有一个非常相似的情况:

频谱扫描错误代码:15007 上下文:表和文件之间的列数不匹配。表格列:12,数据列:13

我的 Redshift 表有 13 列。如果我在 pandas 中打开 Parquet 文件,它也有 13 列,Parquet 文件派生自的 src 数据也是如此。

这是什么意思?

事实证明,默认情况下 Redshift 会忽略作为“身份”列的列。

这是我的错...我从我的 src Postgres 数据库中复制并粘贴了该表的

CREATE TABLE
sql,例如我有:

CREATE TABLE public.mytable (
    id bigint NOT NULL identity(1, 1) ENCODE az64,
    ...

所以它不想将 Parquet 文件中的

id
值插入表中,因为我已将其定义为自动 id 列。

explicit_ids
添加到
COPY ... FROM 
,如下所示 https://docs.aws.amazon.com/redshift/latest/dg/r_COPY_command_examples.html#r_COPY_command_examples-load-venue-with-explicit-values-for- an-identity-column修复了它。

© www.soinside.com 2019 - 2024. All rights reserved.