AWS Glue 4.0创建临时视图报错AnalysisException:表或视图未找到
问题
在AWS Glue 4.0中基于DataFrame创建临时视图后执行SQL,报错AnalysisException: Table or view not found,涉及的Glue数据库表为Hudi格式。
相关代码
import sys from awsglue.transforms import * from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.job import Job from pyspark.sql.functions import * sc = SparkContext.getOrCreate() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) # Define the Glue Data Catalog database and table names database_name = "hudi_db" table4_name = 'd_person' table4 = glueContext.create_data_frame.from_catalog( database=database_name, table_name=table4_name, ) rows = table4.count() distinct_rows = table4.distinct().count() print(f"Number of rows in data frame: {rows} and distinct rows are: {distinct_rows}") table4.createOrReplaceTempView(table4_name + '_glue_view') custom_sql_query = """ SELECT count(*) FROM d_person_glue_view """ # Execute the custom SQL query result_df = spark.sql(custom_sql_query)
已尝试操作
- 在GlueContext构造函数中使用自定义SparkSession
- 基于GlueContext的spark_session对象执行SQL
- 直接使用SparkSQL查询(此方法可行,但希望先加载DataFrame再创建视图)
可能原因与解决方案
核心原因
- Hudi表的会话上下文隔离:Glue加载Hudi表时,内部会触发Hudi专属的数据源逻辑,可能导致生成的DataFrame绑定的会话上下文,与你获取的
glueContext.spark_session并非完全共享临时视图的可见性。 - 临时视图作用域限制:
createOrReplaceTempView创建的视图仅在当前SparkSession的特定作用域内有效,若Hudi加载过程中触发了会话内部的上下文切换,视图会无法被后续SQL识别。 - Glue 4.0的Hudi集成配置缺失:Glue 4.0对Hudi的支持依赖特定Spark参数,缺少配置会导致DataFrame与SparkSession的绑定异常。
解决方案
方案1:使用DataFrame关联的会话执行SQL
每个DataFrame都自带sql_ctx属性,指向创建它的SparkSession,用这个上下文执行SQL能确保视图可见:
# 替换原有的spark.sql调用 result_df = table4.sql_ctx.sql(custom_sql_query)
方案2:初始化时配置Hudi专属Spark参数
在创建SparkContext时显式配置Hudi所需参数,确保会话上下文统一:
from pyspark.conf import SparkConf # 配置Hudi必备的Spark参数 conf = SparkConf() conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") conf.set("spark.sql.extensions", "org.apache.spark.sql.hudi.HoodieSparkSessionExtension") conf.set("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.hudi.catalog.HoodieCatalog") sc = SparkContext.getOrCreate(conf=conf) glueContext = GlueContext(sc) spark = glueContext.spark_session
之后再加载DataFrame并创建视图,视图会在统一的会话中生效。
方案3:改用全局临时视图
全局临时视图的作用域是整个Spark应用,不受单个会话内部切换影响:
table4.createOrReplaceGlobalTempView(table4_name + '_glue_view') custom_sql_query = """ SELECT count(*) FROM global_temp.d_person_glue_view """ result_df = spark.sql(custom_sql_query)
内容的提问来源于stack exchange,提问作者Arjun Singh
相关产品推荐
相关产品推荐

