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

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再创建视图)

可能原因与解决方案

核心原因

  1. Hudi表的会话上下文隔离:Glue加载Hudi表时,内部会触发Hudi专属的数据源逻辑,可能导致生成的DataFrame绑定的会话上下文,与你获取的glueContext.spark_session并非完全共享临时视图的可见性。
  2. 临时视图作用域限制:createOrReplaceTempView创建的视图仅在当前SparkSession的特定作用域内有效,若Hudi加载过程中触发了会话内部的上下文切换,视图会无法被后续SQL识别。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:13:19