Jupyter中运行spark.sql查询PostgreSQL表提示不存在如何解决
根本原因
你通过spark.read.jdbc读取PostgreSQL表仅生成了独立的DataFrame对象,没有同步到Spark的SQL元数据目录中,因此spark.sql()执行时无法识别tbname的表映射关系,可通过以下任意一种方案解决:
方案一:注册临时/全局视图(最简便,适合单次会话使用)
在读取完DataFrame的代码后新增视图注册逻辑即可:
df = spark.read.jdbc(url=url, table='tbname', properties=properties) # 新增这一行:注册会话级临时视图,当前SparkSession生命周期内有效 df.createOrReplaceTempView("tbname")
之后直接执行spark.sql("select * from tbname")即可正常返回结果。
注:如果需要跨SparkSession使用视图,可以注册全局临时视图,查询时需要加global_temp前缀:
# 注册全局临时视图 df.createOrReplaceGlobalTempView("tbname") # 查询语句 spark.sql("select * from global_temp.tbname")
方案二:配置PostgreSQL为Spark外部Catalog(适合长期使用,无需每次读表注册)
初始化SparkSession时直接配置JDBC Catalog,配置完成后可以直接查询PostgreSQL库中所有表,不需要提前读取DataFrame再注册:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .config('spark.driver.extraClassPath', '/home/statspy/postgresql-42.2.23.jar') \ # 配置PostgreSQL外部Catalog .config("spark.sql.catalog.pg", "org.apache.spark.sql.execution.datasources.jdbc.JDBCCatalog") \ .config("spark.sql.catalog.pg.url", "jdbc:postgresql://127.0.0.1/dbname") \ .config("spark.sql.catalog.pg.user", "postgres") \ .config("spark.sql.catalog.pg.password", "secret") \ .config("spark.sql.catalog.pg.driver", "org.postgresql.Driver") \ .getOrCreate()
查询时使用Catalog名.库名.表名的格式即可:
spark.sql("select * from pg.public.tbname")
方案三:SQL语句内置JDBC参数(Spark 3.0+支持,无需提前读表)
直接在spark.sql语句中声明JDBC连接参数,不需要提前执行读表操作:
spark.sql(""" select * from jdbc( url 'jdbc:postgresql://127.0.0.1/dbname', dbtable 'tbname', user 'postgres', password 'secret', driver 'org.postgresql.Driver' ) """)
内容的提问来源于stack exchange,提问作者merchmallow
相关产品推荐
相关产品推荐

