PySpark带库名创建全局临时视图报错及SparkSession用法咨询
PySpark带库名创建视图及Spark Session函数验证
一、带库名使用视图的解决办法
为啥会报错
全局临时视图(Global Temp View)是Spark内置的特殊视图,默认都存在global_temp这个系统数据库里。你用createOrReplaceGlobalTempView(f"{db}.{table}")的时候,其实是把视图的名字直接设成了db.table(当成一个完整的标识符),不是把视图放到你自定义的db库下面。所以你查db.table的时候,Spark找不到对应的库表结构,自然报错。
正确的实现方式
要实现带自定义库名的视图,得先创建自己的数据库,再把视图挂到这个库下面,别用全局临时视图(它的设计目的是跨Session共享,固定归属global_temp库)。修改代码如下:
- 修改视图创建逻辑:
def create_views(config): spark = create_and_return_spark_session() for source in valid_data_sources(): db = get_database_for_source(source, config) if db == "": continue # 先创建数据库,不存在则自动创建 spark.sql(f"CREATE DATABASE IF NOT EXISTS {db}") for table in all_table_names(): print(f"Create View: {db}.{table}") df = spark.read.option("header", "true").csv(f"/csv/{db}.{table}.csv") # 创建归属到指定数据库的临时视图(仅当前Session有效) df.createOrReplaceTempView(f"{db}.{table}") # 如果需要跨Session访问,可创建永久视图(需配置Hive等元数据存储): # df.createOrReplaceTempView(f"{table}_temp") # spark.sql(f"CREATE OR REPLACE VIEW {db}.{table} AS SELECT * FROM {table}_temp") return spark
- 查询视图:
你原来的查询代码spark.sql("SELECT * FROM db.table")无需修改,只要数据库和视图创建成功,就能正常访问数据。
如果确实需要使用全局临时视图并区分库,可以将视图命名为{db}_{table},查询时写SELECT * FROM global_temp.{db}_{table},但这不是标准的库表结构用法,不推荐。
二、create_and_return_spark_session函数验证
你的这个函数逻辑是正确的,符合Spark的最佳实践——优先复用已活跃的Session,无活跃Session时再创建新Session。
可以稍微简化代码,更贴合Python的写法:
def create_and_return_spark_session(): active_session = SparkSession.getActiveSession() if active_session: print('ACTIVE') return active_session print('NO ACTIVE') return SparkSession.builder.appName('Local Spark Session1').getOrCreate()
原代码中SparkSession.getActiveSession() == None的判断是合法的,但直接判断active_session更简洁,因为getActiveSession()返回的是可选类型,非空时布尔值为True。
内容的提问来源于stack exchange,提问作者Ekrem Üçüncü
相关产品推荐
相关产品推荐

