如何在 Hive 中创建静态视图?

Posted

技术标签:

【中文标题】如何在 Hive 中创建静态视图?【英文标题】:How to create static views in Hive? 【发布时间】:2018-04-12 10:32:50 【问题描述】:

就像我在下面创建视图一样,

CREATE OR REPLACE VIEW V_TMP AS 
SELECT 1 AS LEVEL_ID,'URBAN' AS ITEM_CODE
UNION ALL
SELECT 1 AS LEVEL_ID,'RURAL' AS ITEM_CODE
UNION ALL
SELECT 9999 AS LEVEL_ID,'ALL' AS ITEM_CODE;

它抛出以下错误:

编译语句时出错:FAILED: SemanticException No valid 权限 所需权限(表)在输入中不可用 权限 所需权限:

有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

给定的查询将不起作用,因为它没有从任何表中获取数据。在 hive 中,在创建静态视图时,您仍然需要从表中获取数据。如果它是 oracle,您可以直接从虚拟表中获取。

因此,您可以通过 2 种方法来创建静态视图。

    将其指向任何现有表并使用 where 1=1 条件。

    创建一个虚拟表并使用如下所示的虚拟表选择它。

    创建虚拟表(id int)

    插入虚拟对象(1)

    创建或替换视图 V_TMP1(LEVEL_ID,ITEM_CODE)AS SELECT 1 AS LEVEL_ID,'URBAN' AS ITEM_CODE from dummy 联合所有 SELECT 1 AS LEVEL_ID,'RURAL' AS ITEM_CODE from dummy 联合所有 SELECT 9999 AS LEVEL_ID,'ALL' AS ITEM_CODE from dummy;

【讨论】:

【参考方案2】:

请检查您是否在 hive 仓库中拥有必要的权限,并尝试使用任何其他数据库来创建您的视图。

有时,默认数据库并未授予所有用户的权限。

如果您使用的是 Kerberos 集群,则需要检查 Hive 用户是否具有必要的哨兵角色。

否则:-

CREATE OR REPLACE VIEW V_TMP1 (LEVEL_ID , ITEM_CODE  ) AS 
SELECT 1 AS LEVEL_ID,'URBAN' AS ITEM_CODE
UNION ALL
SELECT 1 AS LEVEL_ID,'RURAL' AS ITEM_CODE
UNION ALL
SELECT 9999 AS LEVEL_ID,'ALL' AS ITEM_CODE;

【讨论】:

我可以创建其他视图,例如 CREATE OR REPLACE VIEW TMP AS SELECT * FROM TABLE1;但无法创建静态视图。 看起来有点奇怪,我在我的虚拟机中执行了你的查询,它运行没有任何问题。 我已经编辑了我的答案,检查它是否有效。 不走运,您的查询也没有执行!

以上是关于如何在 Hive 中创建静态视图?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 开发 - 如何使用自定义 Table View Controller 显示在 Interface Builder 中创建的静态单元格?

在 Pig 中使用 Hcat Loader 访问在 Hive 中创建的视图

如何使用 sqoop 在 hive 中创建多级分区

如何在 Cocoa 中创建这种面板?

如何在 Hive CDH 中创建 ORC 文件?

使用 create-hive-table 在 Hive 中创建表时如何使用自定义分隔符