我在我的工作区中启用并运行了我的 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.
我在这里做错了什么?
您收到的错误消息 [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)
请注意,临时视图不会在不同的会话中保留,因此您需要在每次开始新会话时重新创建它们。