如何在Spark中指定路径读取已保存的外部表?
解决方案
首先明确:spark.read.table()的参数是表名,不是文件路径,直接传路径会触发SQL语法错误,这就是你遇到报错的原因。不想修改spark.sql.warehouse.dir的话,有以下几种可行的读取方式:
方法1:临时关联路径到表名(SQL方式)
通过SQL语句创建一个临时关联目标路径的表,之后用read.table()读取:
CREATE TEMPORARY TABLE temp_yearly_calltype USING parquet -- 需与保存时的格式一致,比如parquet、orc等 LOCATION '/home/user/tables/firstProject';
读取临时表:
df = spark.read.table("temp_yearly_calltype")
临时表仅在当前Spark会话有效,不会修改元数据仓库。
方法2:直接读取路径下的数据文件
因为已经指定了保存路径,直接用对应格式的读取方法加载即可:
# Spark默认保存格式为parquet,直接读取 df = spark.read.parquet("/home/user/tables/firstProject") # 如果保存时用了其他格式,比如orc # df = spark.read.orc("/home/user/tables/firstProject")
这种方法无需依赖表元数据,直接读取数据文件,操作最简单。
方法3:通过Catalog注册临时视图
用Spark的Catalog API注册临时视图,再读取:
spark.catalog.createTempView( "temp_calltype", path="/home/user/tables/firstProject", source="parquet" ) df = spark.read.table("temp_calltype")
同样是临时关联,会话结束后自动失效,不会影响全局配置。
内容的提问来源于stack exchange,提问作者DumbCoder
相关产品推荐
相关产品推荐

