AnalysisException: Table or view not found --- 即使我使用“createGlobalTempView”创建了一个视图,如何解决?

Posted

技术标签:

【中文标题】AnalysisException: Table or view not found --- 即使我使用“createGlobalTempView”创建了一个视图,如何解决?【英文标题】:AnalysisException: Table or view not found --- Even after I create a view using "createGlobalTempView" , how to fix? 【发布时间】:2019-09-13 15:44:24 【问题描述】:

我正在使用 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"));

同样的错误

【问题讨论】:

【参考方案1】:

这些全局视图存在于名为global_temp 的数据库中,因此我建议您将查询中的表引用为global_temp.table_name。我不确定它是否能解决你的问题,但你可以试试。

来自 Spark 源代码:

全局临时视图是跨会话的。它的生命周期是 Spark 应用程序的生命周期,即当应用程序终止时它会被自动删除。它与系统保留的数据库global_temp 相关联,我们必须使用限定名称来引用全局临时视图,例如SELECT * FROM global_temp.view1.

【讨论】:

@BdLearner 我会担心您的日志WARN ObjectStore: Failed to get database global_temp, returning NoSuchObjectException 中的这个警告。它似乎无法访问 global_temp 数据库。如果将“createGlobalTempView”替换为createOrReplaceTempView,会发生什么?这个函数应该在default 数据库中创建视图。 你能帮忙并建议如何处理这个***.com/questions/62036791/…【参考方案2】:

在创建会话时删除 .enableHiveSupport()。这会很好。

SparkSession spark = SparkSession
        .builder()
        .appName("DatabaseMigrationUtility")
        //.enableHiveSupport()
        .getOrCreate();

正如大卫所说,使用 global_temp。参考表格。

【讨论】:

以上是关于AnalysisException: Table or view not found --- 即使我使用“createGlobalTempView”创建了一个视图,如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

Impala使用SQL即席查询出现AnalysisException: Could not resolve table reference:的解决办法

PYSPARK org.apache.spark.sql.AnalysisException:无法解析给定输入列的“INPUT__FILE__NAME”

如何在 Spark Table 中创建索引?

如何正确处理 spark.sql.AnalysisException

AnalysisException:无法解析给定的输入列:

SQL 语句中的 Databricks 错误:AnalysisException:无法解析 '``' 给定的输入列: