apache-spark - 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 中替换它。然而功能并不存在。
解决方案
我想到了。
简短的回答是...... 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)
推荐阅读
- node.js - Node-Red:将数据传递到 exec 的标准输入,而不是重新运行
- java - 如何使用流检查多个集合的字符串
- xamarin - 如果行定义中的所有行大小相等,我是否需要在 * 前面指定一个数字?
- haskell - Haskell - 生成长度为 k 的子集
- java - Java 堆排序和计数排序返回 false
- c# - 来自 Axios 405 或 415 错误的 Vue.js 和 .NET WEBAPI2 POST
- docker - 使用 docker 镜像设置 Keycloak SSL
- python - 查找熊猫中最长列的长度
- reactjs - 你如何在打字稿中注释一个未命名的箭头函数
- symlink - 为什么 Snakemake 看不到符号链接文件?