Glue脚本Redshift并行查询报语法错误求助
问题定位与修复方案
核心错误原因
查询语句末尾冗余的
AND:你的Redshift查询字符串最后保留了AND,当启用enablePartitioningForSampleQuery时,Glue会自动在原查询的WHERE子句后追加哈希分区过滤条件(比如MOD(day, N) = X),拼接后的SQL会变成... AND AND MOD(...) = ...,直接触发syntax error at or near ")"。- MySQL脚本未报错是因为MySQL解析器对末尾冗余
AND有容错性,但这属于不规范写法,同样需要修正。
- MySQL脚本未报错是因为MySQL解析器对末尾冗余
hashpartitions参数类型错误:你传入的是日期字符串str(end_date),但该参数要求是整数类型的分区数量,字符串会导致Glue生成的SQL语法异常。hashfield字段有效性问题:你指定的hashfield是day,但当前查询未涉及该字段,需确保test_db.public.test_table表中存在day字段,否则追加的分区条件会因字段不存在报错。
修复步骤
1. 修正Redshift查询语句
删除末尾冗余的AND,确保基础SQL语法合法:
query = f""" SELECT DISTINCT id as id_list FROM test_db.public.test_table WHERE timestamp BETWEEN {start} AND {end} """
2. 修正hashpartitions参数
将其改为整数类型的分区数量(比如根据业务需求设置为30、60等),示例:
# 假设需要按30个分区并行查询 "hashpartitions": "30",
注意:如果end_date是当月最后一天,你想以此作为分区数,需要先将日期转换为天数(比如end_date.day)再转为字符串。
3. 验证hashfield字段
确保test_db.public.test_table中存在day字段;如果day是从timestamp字段派生的(比如日期部分),需调整hashfield为timestamp,或在查询中明确提取该字段并用于分区:
# 示例:如果day是timestamp的日期部分,调整hashfield为timestamp "hashfield": "timestamp",
修正后的完整Redshift脚本片段
query = f""" SELECT DISTINCT id as id_list FROM test_db.public.test_table WHERE timestamp BETWEEN {start} AND {end} """ # Get list of ids from Redshift redshift_data_frame = glueContext.create_dynamic_frame.from_options( connection_type="redshift", connection_options={ "sampleQuery": query, "redshiftTmpDir": args["TempDir"], "useConnectionProperties": "true", "connectionName": "redshift-conn", "enablePartitioningForSampleQuery": True, "hashfield": "day", # 确保该字段存在于目标表中 "hashpartitions": "30", # 替换为实际需要的整数分区数 "aws_iam_role": args["AWS_IAM_ROLE"], }, additional_options={"aws_iam_role": args["AWS_IAM_ROLE"]}, transformation_ctx="redshift_data_frame", )
内容的提问来源于stack exchange,提问作者Shardul Birje
相关产品推荐
相关产品推荐

