Redshift Spectrum外部表直接查询卡滞在Discover attribute {column name}求助
可能原因及修复方案
列类型与底层数据不匹配
外部表定义的列类型如果和S3底层实际数据的类型、格式不匹配,Spectrum会自动尝试探测列属性,进而导致查询卡住。比如表定义为INT类型的列,实际数据是带特殊格式的字符串,或者日期列的格式和表中指定的不兼容。
修复:核对外部表DDL与S3数据的实际格式,修正列定义。如果是日期列,需指定正确的格式参数,示例:CREATE EXTERNAL TABLE spectrum.my_external_table ( event_date DATE FORMAT 'YYYY-MM-DD' ) STORED AS PARQUET LOCATION 's3://your-bucket/path/';分区元数据不一致
若外部表是分区表,分区键的定义和S3实际分区路径的格式不匹配,会触发Spectrum反复扫描分区以探测属性,导致查询停滞。
修复:刷新分区元数据,执行:ALTER TABLE spectrum.my_external_table RECOVER PARTITIONS;若手动添加过分区,需确保分区路径与表定义的分区键完全一致。
底层数据存在脏数据
S3路径下存在空文件、格式错误的行、非预期类型的文件时,Spectrum扫描解析这些数据会陷入停滞,表现为卡在属性探测环节。
修复:清理S3路径下的脏数据,或在创建外部表时通过SerDe参数跳过错误行。比如使用OpenCSV SerDe时:ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( 'skip.header.line.count' = '1', 'ignore.malformed.json' = 'true' )视图查询触发了谓词下推优化
视图中可能包含过滤条件,Redshift会将过滤逻辑下推到Spectrum,仅扫描符合条件的数据,避免了全表扫描时的属性探测;而直接查询全表时无过滤条件,触发了全量数据的属性探测流程。
修复:直接查询时添加合理的过滤条件(比如基于分区键的过滤),强制触发谓词下推,减少扫描的数据量。Spectrum资源配额不足
当查询所需的Spectrum扫描资源超过当前账户配额时,会出现资源等待的情况,表现为卡在属性探测环节。
修复:检查Redshift集群的Spectrum资源使用情况,必要时提交配额提升申请,或错开业务高峰时段执行查询。
内容的提问来源于stack exchange,提问作者abd

