数据块中的 Unity 目录不支持 Spark 命令

问题描述 投票:0回答:1

我在我的工作区中启用并运行了我的 Unity 目录,我希望在“requestProjectUrlName”列之一上创建一个视图。我可以通过运行以下命令按一个项目名称创建视图。例如,我可以在我的列中包含数据“XYZ”的地方创建视图。

CREATE OR REPLACE VIEW main.deltalake_db.Customers_Log_Table_RLS AS
 SELECT *
 FROM main.deltalake_db.Customers_Log_Table
 WHERE
   CASE
     WHEN requestProjectUrlName = "XYZ"
     ELSE FALSE
   END;

但是,当我尝试通过运行如下循环来创建具有项目名称的多个视图时

distinctprojects = df.select('requestProjectUrlName').distinct()
target_database = "main.deltalake_db"
for project in distinctprojects.collect():
    project_name = project['requestProjectUrlName']
    view_name = f"view_{project_name.replace(' ', '_').replace('-', '_')}"
    create_view_query = f"""
    CREATE OR REPLACE VIEW `{target_database}`.`{view_name}` AS
    SELECT * FROM main.deltalake_db.Customers_Log_Table
    WHERE requestProjectUrlName = '{project_name}'
    """
    spark.sql(create_view_query)

这里我的 df 只是数据框,而 distinctprojects 确实给了我所有独特的项目名称。

我收到错误消息

[UC_COMMAND_NOT_SUPPORTED] Creating a persistent view that references both Unity Catalog and Hive Metastore objects is not supported in Unity Catalog.
我在这里做错了什么?

pyspark databricks databricks-unity-catalog
1个回答
0
投票

您收到的错误消息 [UC_COMMAND_NOT_SUPPORTED] Creating a persistent view that references both Unity Catalog and Hive Metastore objects is not supported in Unity Catalog,建议您尝试创建一个同时引用 Unity Catalog 和 Hive Metastore 对象的视图同一视图定义中的对象。这在 Unity Catalog 中不受支持。

这里最有可能的问题是您的 main.deltalake_db.Customers_Log_Table 是 Unity 目录中的一个表,但是您尝试创建的视图引用了一个 Hive Metastore 对象。这可以通过确保视图中引用的所有对象都来自 Unity 目录来解决。

这里有一些解决这个问题的建议:

检查 main.deltalake_db.Customers_Log_Table 是否是 Unity Catalog 中的表。如果它是 Hive Metastore 对象,您可能希望在视图中仅使用 Hive Metastore 对象或将表迁移到 Unity Catalog。

确保视图中引用的所有表和数据库都在 Unity 目录中。验证数据库和表的名称,并确保没有拼写错误或不正确的引用。

如果您仍然遇到问题,请考虑创建临时视图而不是持久视图。临时视图仅在会话期间可用,不会存储在 Hive Metastore 中。这可能会帮助您避免与引用 Unity Catalog 和 Hive Metastore 对象相关的问题。

要创建临时视图,您可以将 CREATE OR REPLACE VIEW 语句替换为 CREATE OR REPLACE TEMPORARY VIEW:

create_view_query = f"""
CREATE OR REPLACE TEMPORARY VIEW `{view_name}` AS
SELECT * FROM main.deltalake_db.Customers_Log_Table
WHERE requestProjectUrlName = '{project_name}'
"""
spark.sql(create_view_query)

请注意,临时视图不会在不同的会话中保留,因此您需要在每次开始新会话时重新创建它们。

© www.soinside.com 2019 - 2024. All rights reserved.