在Apache Hive中选择表是否存在

5

I have a hive query which is of the format,

select . . . from table1 left join (select . . . from table2) on (some_condition)
可能根据环境不同不存在。因此,如果只有存在,我想要进行连接,否则就忽略子查询。

如果存在,以下查询将返回表名:

show tables in {DB_NAME} like '{table_name}'

但我不知道如何将其集成到我的查询中,以仅在存在时选择。

在Hive查询中是否有一种方法可以在选择之前检查表是否存在。

感谢任何帮助

注意:如果不存在,我不想创建该表。


1
如果创建一个虚拟表,如果不存在这个选项,那么不幸的是,使用Hive可能无法完全实现。目前,Hive命令不支持像if condition这样的编程特性。我认为你应该考虑使用shell脚本来执行Hive脚本,并在执行之前检查特定条件。如果可以,请告诉我。 - Gyanendra Dwivedi
很好的观点@gyan。我想到了,但是hive查询有多个子查询和嵌套查询。尝试使用shell来实现这一点会更加复杂。如果找不到替代方案,我会尝试这样做。另外,只是想检查是否有其他在hive中完成它的选项。 - Maverick
欢迎 @Maverick。我认为将查询分解成片段,并使用shell脚本有条件地执行它们,可以使其更易于管理和移植。 - Gyanendra Dwivedi
@Maverick,你做了什么? - Suvarna Pattayil
1
@SuvarnaPattayil:我找不到实现它的方法。我为不同环境编写了不同的查询。(在我的情况下,我想要一个适用于所有环境的通用查询) - Maverick
@Maverick。谢谢! - Suvarna Pattayil
1个回答

0

在评论中已经提到Hive不支持if-else结构,所以如果你想要它,你就必须从像bash或HPL/SQL这样的语言中借用它。

我在这里建议的结构如下:

  1. 将查询的两个版本作为视图定义放入单独的文件中:

view_ddl_if_exists.hql:

create view if not exists target_view
as
select . . . from table1 left join (select . . . from table2) on (some_condition)

view_ddl_if_not_exists.hql:

create view if not exists target_view
as
select . . . from table1

添加 shell 脚本来检测实际视图定义并将其复制到预定义位置:

place_correct_view_source.sh

if hive -S -e 'explain select 1 from table2' &>/dev/null; then
  cp view_ddl_if_exists.hql actual_view_ddl.hql
else 
  cp view_ddl_if_not_exists.hql actual_view_ddl.hql
fi
  1. 将以下内容添加到您的脚本/初始化脚本中:
!bash place_correct_view_source.sh;
source actual_view_ddl.hql;
...

太好了!您已经在视图target_view中获得了正确的查询,并可以在您的脚本中使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接