首页 > 解决方案 > AnalysisException:不允许添加数据库前缀

问题描述

我正在尝试从使用 JDBC 的模式中的表中读取数据。但是,我收到一个错误:

org.apache.spark.sql.AnalysisException: It is not allowed to add database prefix `myschema` for the TEMPORARY view name.;

代码非常简单,第三行出现错误(其他代码只是为了显示我在做什么)。myOptions 包括 url、dbtable、驱动程序、用户、密码。

SQLContext sqlCtx = new SQLContext(ctx);
Dataset<Row> df = sqlCtx.read().format("jdbc").options(myOptions).load();

df.createOrReplaceTempView("myschema.test_table");
df = sqlCtx.sql("select field1, field2, field3 from myschema.test_table");

因此,如果不允许使用数据库/模式限定符,那么如何为您的表引用正确的限定符?离开它会从数据库中得到一个“无效的对象名称”,这是预期的。

我在数据库端的唯一选择是使用默认模式,但是这是基于用户的而不是基于会话的,所以我必须为每个我想要访问的模式创建一个用户和连接。

我在这里想念什么?这似乎是一个常见的用例。

编辑:对于那些试图关闭它的人来说......“无法再复制的问题或简单的印刷错误”如何评论为什么这是关闭的原因?如果我打错字或犯了一个简单的错误,请发表评论并告诉我什么。我不可能是唯一遇到这种情况的人。

registerTempTable在 Spark 1.2 中曾经以这种方式工作,我们被告知createOrReplaceTempView应该在 2.x 中替换它。然而功能并不存在。

标签: apache-sparkapache-spark-sql

解决方案


我想到了。

简短的回答是...... dbtable 名称和临时视图/表名称是两个不同的东西,不必具有相同的值。dbtable 定义在数据库中以获取数据,临时视图/表用于定义您在 Spark SQL 中调用的内容。

起初这令人困惑,因为在 Spark 1.6 中,它允许视图名称与完整的表名称匹配(因此我使用的软件在 1.6 中都将其插入)。如果您手动编写代码,您只需为临时表或 1.6 或 2.2 上的视图使用非限定表名。

为了在 Spark 1.6 的模式中引用表,我必须执行以下操作,因为 dbtable 和视图名称相同:

1. dbtable to "schema.table"
2. registerTempTable("schema.table")
3. Reference table as `schema.table` (include the ticks to treat the entire thing as an identifier to match the view name) in the SQL

但是,在 Spark 2.2 中,您需要这样做,因为视图名称中不允许使用模式/数据库:

1. dbtable to "schema.table"
2. createOrReplaceTempView("table")
3. Reference table (not schema.table) in the SQL (matching the view)

推荐阅读