apache-spark - AnalysisException: Table or view not found --- 即使我使用“createGlobalTempView”创建了一个视图,如何修复?
问题描述
我正在使用 spark-sql-2.4.1v 在我的 PoC 中进行流式传输。我正在尝试通过将数据框注册为表来进行连接。
我正在使用 createGlobalTempView 并执行以下操作
first_df.createGlobalTempView("first_tab");
second_df.createGlobalTempView("second_tab");
Dataset<Row> joinUpdatedRecordsDs = sparkSession.sql("select a.* , b.create_date, b.last_update_date from first_tab as a "
+ " inner join second_tab as b "
+ " on a.company_id = b.company_id "
);
错误 org.apache.spark.sql.AnalysisException:找不到表或视图:first_tab;第 1 行 pos 105
我在这里做错了什么?如何解决这个问题?
更多信息
在我的 spark 会话中,我设置了“.enableHiveSupport()”。
当我看到日志时,我发现了这些痕迹
19/09/13 12:40:45 WARN ObjectStore: Failed to get database global_temp, returning NoSuchObjectException
19/09/13 12:40:45 INFO HiveMetaStore: 0: get_table : db=default tbl=first_tab
19/09/13 12:40:45 INFO audit: ugi=userrw ip=unknown-ip-addr cmd=get_table : db=default tbl=first_tab
19/09/13 12:40:45 INFO HiveMetaStore: 0: get_table : db=default tbl=second_tab
19/09/13 12:40:45 INFO audit: ugi=userrw ip=unknown-ip-addr cmd=get_table : db=default tbl=second_tab
19/09/13 12:40:45 INFO HiveMetaStore: 0: get_database: default
19/09/13 12:40:45 INFO audit: ugi=userrw ip=unknown-ip-addr cmd=get_database: default
19/09/13 12:40:45 INFO HiveMetaStore: 0: get_database: default
19/09/13 12:40:45 INFO audit: ugi=userrw ip=unknown-ip-addr cmd=get_database: default
19/09/13 12:40:45 INFO HiveMetaStore: 0: get_tables: db=default pat=*
19/09/13 12:40:45 INFO audit: ugi=userrw ip=unknown-ip-addr cmd=get_tables: db=default pat=*
System.out.println("first_tab exists : " + sparkSession.catalog().tableExists("first_tab")); System.out.println("second_tab exists : " + sparkSession.catalog().tableExists("second_tab"));
输出
first_tab exists : false
second_tab exists : false
我尝试如下打印数据库中的表格,但没有打印。
sparkSession.catalog().listTables().foreach( tab -> {
System.out.println("tab.database :" + tab.database());
System.out.println("tab.name :" + tab.name());
System.out.println("tab.tableType :" + tab.tableType());
});
没有输出打印,因此我们可以说没有创建表。
我试图用“ global_temp. ”创建表,但抛出错误
org.apache.spark.sql.AnalysisException: It is not allowed to add database prefix `global_temp` for the TEMPORARY view name.;
at org.apache.spark.sql.execution.command.CreateViewCommand.<init>(views.scala:122)
我试图通过附加“ global_temp. ”来引用表,但在上面抛出相同的错误
IE
System.out.println("first_tab exists : " + sparkSession.catalog().tableExists("global_temp.first_tab"));
System.out.println("second_tab exists : " + sparkSession.catalog().tableExists("global_temp.second_tab"));
与上述错误相同
解决方案
这些全局视图以名称存在于数据库中,global_temp
因此我建议您将查询中的表引用为global_temp.table_name
. 我不确定它是否能解决您的问题,但您可以尝试一下。
从 Spark 源代码:
全局临时视图是跨会话的。它的生命周期是 Spark 应用程序的生命周期,即当应用程序终止时它会被自动丢弃。它与系统保留的数据库相关联
global_temp
,我们必须使用限定名称来引用全局临时视图,例如SELECT * FROM global_temp.view1
.
推荐阅读
- github - Github action 一个接一个地运行两个进程
- c - 提供给 system() 的命令对其他用户可见吗?
- r - 比较箱线图中的特定行和整行
- c - 原因不明的分段错误 (C)
- c - 为什么最后一个'printf'函数没有执行?
- docker - 主机和 docker nginx https 设置
- python - 使用python脚本在abaqus中提取节点集坐标
- python - 为什么我的获胜者检查功能无法正常工作?
- flutter - Flutter SocketException:操作系统错误:连接被拒绝,errno = 111
- linux - perf intel_pt 无法解析 .plt 部分的符号