我正在尝试将位于 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"
如果出现此类问题,请在此处为其他任何人发布答案。
问题是镶木地板文件总共有 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,并且复制成功
对于其他遇到此错误的人,我有一个非常相似的情况:
频谱扫描错误代码: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修复了它。