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

Redshift Spectrum查询Parquet数据报错解决方案咨询

问题排查与解决方案

1. Spectrum 15001错误排查

该错误本质是Spectrum扫描时的列类型不匹配,仅检查Parquet文件字段类型不够,需要额外排查以下点:

  • 确认Glue表中array_col的定义类型,以及三个分区Parquet文件中array_col的物理类型是否统一:如果Glue定义为字符串类型,但某个分区的Parquet实际存储的是原生LIST/STRUCT复合类型,简单查询select *不会触发强转换所以不报错,但调用JSON_PARSE时会触发隐式类型转换抛出异常。可以先执行测试语句SELECT typeof(array_col) FROM table LIMIT 10确认返回类型是否统一。
  • 检查pyarrow 5.0写入参数是否统一:pyarrow 5.0写嵌套数组时,use_compliant_nested_type参数开启和关闭会生成两种不同结构的Parquet数组存储格式,Redshift Spectrum识别时会判定为类型不匹配,确认三个分区的写入代码使用了完全一致的写入参数。
  • 可额外增加过滤逻辑规避非法值:如果必须保留JSON_PARSE的写法,调整语句为SELECT JSON_PARSE(LOWER(array_col)) FROM table WHERE array_col IS NOT NULL AND json_valid(LOWER(array_col)),过滤掉空值和非法JSON格式的记录后再做转换。

2. PortalSuspended状态报错解决方案

Invalid protocol sequence 'P' while in PortalSuspended state和SQL逻辑无关,是Redshift客户端驱动的连接挂起问题:

  • 如果使用Web控制台、第三方SQL客户端执行查询,直接断开当前连接重连即可恢复。
  • 如果通过代码脚本执行查询,开启连接自动提交配置,每次查询完成后主动关闭游标再发起新查询即可避免该问题。

3. 更稳定的Unnest实现方案

建议直接调整Glue表中array_col的类型定义为SUPER,Redshift Spectrum可直接识别Parquet原生LIST/STRUCT类型映射为SUPER,不需要做任何字符串转JSON的操作,直接执行如下语句即可完成数组展开:

SELECT t.item 
FROM table, UNNEST(array_col) AS t(item)

该方案兼容Looker查询场景,性能远高于JSON转换写法,也不会出现大小写适配的异常问题。如果后续需要添加行排序逻辑,直接在该语句基础上增加ORDER BY子句即可,和当前报错无关联。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:15:05