使用glue_context.sql查询SVV_EXTERNAL_PARTITIONS报错,求Glue读取系统视图方法
解决Glue中查询Redshift系统视图SVV_EXTERNAL_PARTITIONS的问题
问题原因
SVV_EXTERNAL_PARTITIONS是Redshift专属的系统视图,并非Glue Data Catalog的对象。GlueContext默认的SQL引擎基于Spark SQL,无法直接访问Redshift集群内的系统视图,必须通过Redshift专属连接来查询。
两种可行解决方案
方案1:使用Glue DynamicFrame读取Redshift系统视图
from awsglue.context import GlueContext from pyspark.context import SparkContext sc = SparkContext() glueContext = GlueContext(sc) # 替换为你的Redshift集群信息和Glue配置 redshift_config = { "url": "jdbc:redshift://<集群端点>:5439/<数据库名>", "dbtable": "SVV_EXTERNAL_PARTITIONS", "user": "<Redshift用户名>", "password": "<Redshift密码>", "redshiftTmpDir": "s3://<你的临时S3桶路径>/redshift-temp/" } # 读取系统视图为DynamicFrame ext_partitions_df = glueContext.create_dynamic_frame.from_options( connection_type="redshift", connection_options=redshift_config ).toDF() # 执行聚合查询 max_value_result = ext_partitions_df.agg({"values": "max"}) max_value_result.show()
方案2:直接用Spark JDBC连接查询
from awsglue.context import GlueContext from pyspark.context import SparkContext sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session # JDBC连接参数 jdbc_params = { "url": "jdbc:redshift://<集群端点>:5439/<数据库名>", "user": "<Redshift用户名>", "password": "<Redshift密码>", "driver": "com.amazon.redshift.jdbc42.Driver" } # 直接查询系统视图 ext_partitions_df = spark.read.jdbc( url=jdbc_params["url"], table="SVV_EXTERNAL_PARTITIONS", properties=jdbc_params ) # 获取最大值 max_value_result = ext_partitions_df.selectExpr("MAX(values) as max_partition_value") max_value_result.show()
关键注意事项
- Redshift权限配置:确保你的Redshift用户拥有
SELECT ON SVV_EXTERNAL_PARTITIONS权限,可在Redshift中执行:GRANT SELECT ON SVV_EXTERNAL_PARTITIONS TO <你的Redshift用户名>; - Glue角色权限:执行脚本的Glue IAM角色需要具备:
- 访问指定S3临时目录的读写权限
- 连接Redshift集群的权限(若使用IAM角色认证Redshift,需提前配置Redshift与Glue角色的关联)
- 不要混淆元数据来源:Glue Data Catalog存储的是你注册的外部表/分区信息,和Redshift的系统视图是完全独立的两套元数据体系。
内容的提问来源于stack exchange,提问作者PeddiePooh
相关产品推荐
相关产品推荐

