PySpark测试作业注册带库名临时表失败,提示找不到临时表
解决PySpark临时表注册后找不到的问题
我帮你分析下问题所在,然后给你具体的解决办法:
为什么会报错?
你遇到的问题主要有两个核心原因:
registerTempTable是Spark 1.x的旧API,在Spark 2.0+已经被废弃,它注册的临时表默认归属default数据库,而你的原代码要读取的是myDb.myTable,Spark自然找不到这个指定库下的表。- 就算用了正确的API,如果没有明确指定目标数据库,临时视图也不会自动归属到
myDb下。
具体解决方案
针对你的场景,有两种不用修改原代码就能解决的方法:
方法一:先创建/切换到目标数据库,再注册临时视图
# 首先确保目标数据库存在,不存在就创建 spark.sql("CREATE DATABASE IF NOT EXISTS myDb") # 切换到myDb数据库 spark.sql("USE myDb") # 将DataFrame注册为该库下的临时视图 myDF.createOrReplaceTempView("myTable")
这样原代码里的hiveContext.table('myDb.myTable')就能正确找到这个临时视图了,因为视图已经归属到myDb库下。
方法二:直接注册带数据库名的临时视图(Spark 2.0+支持)
如果你的Spark版本是2.0及以上,可以直接指定数据库名来注册视图,前提是myDb已经存在:
# 先确保数据库存在 spark.sql("CREATE DATABASE IF NOT EXISTS myDb") # 直接注册到myDb库下 myDF.createOrReplaceTempView("myDb.myTable")
额外提醒
- 如果你还在使用Spark 1.x版本(比较老旧了),可以用旧API但需要先切换数据库:
hiveContext.sql("USE myDb") myDF.registerTempTable("myTable")
- Spark 2.0之后
hiveContext已经被整合到SparkSession,推荐用spark.table('myDb.myTable')替代原代码里的hiveContext.table,不过不修改原代码的话,上面的方法也完全兼容。
内容的提问来源于stack exchange,提问作者summerbulb
相关产品推荐
相关产品推荐

