我正在使用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。”引用表,但在错误上方抛出了相同的错误
即
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"));
以上错误
答案 0 :(得分:2)
这些全局视图以global_temp
的名称存在于数据库中,因此我建议将查询中的表引用为global_temp.table_name
。我不确定它是否可以解决您的问题,但是您可以尝试一下。
从Spark源代码:
全局临时视图是跨会话的。它的生存期是Spark应用程序的生存期,即当应用程序终止时它将被自动删除。它与系统保留的数据库
global_temp
绑定,我们必须使用限定名称来引用全局临时视图,例如SELECT * FROM global_temp.view1
。
答案 1 :(得分:0)
在创建会话时删除.enableHiveSupport()。这样会很好。
| id | Date | Name | Amount |
|-----|:----------:|------:|--------|
| 59 | 11/29/2018 | Chang | 958 |
| 59 | 11/29/2018 | Chang | 1158 |
| 59 | 11/29/2018 | Chang | 595 |
| 45 | 2/13/2019 | Lin | 922 |
| 45 | 2/13/2019 | Lin | 922 |
| 400 | 1/29/2019 | Chris | 3777 |
| 400 | 1/29/2019 | Chris | 4013 |
| 45 | 4/4/2019 | Patty | 3010 |
| 45 | 4/4/2019 | Patty | 2050 |
正如David提到的,使用global_temp。查阅表格。