是否可以选择从 Hive 中的哪个数据库中选择

Posted

技术标签:

【中文标题】是否可以选择从 Hive 中的哪个数据库中选择【英文标题】:Is it possible to choose to select from which database in Hive 【发布时间】:2019-11-25 19:47:42 【问题描述】:

我有一个表,但在两个不同的数据库中。如何根据某些标志查询以仅从其中一个中选择?

例如:

   insert into db2.table2
   select * from db1.table1 if flag is true else select * from db2.table

这个 sudo 查询对应的查询(有效)是什么?

【问题讨论】:

该标志应该通过两个布尔标志的按位与来计算。 HiveQL 不是过程语言。使用shell/python/Java等。也看看这个:hplsql.org/doc 我找到的解决方案是在 hive 中使用 IF THEN;在 IF 语句中,我可以检查在运行时通过某些配置/属性设置的标志。 【参考方案1】:

你可以使用shell传递数据库参数

#!/bin/bash

#calculate database as you want here
db=db1

#substitute variable and execute
hive -e "insert into db2.table2
   select * from $db.table1"

你可以在 Hive 中使用 UNION ALL 做类似的事情,虽然它不是有效的方法:

INSERT OVERWRITE TABLE OUTPUT_TABLE                                                                                                                                      
 SELECT * FROM DB1.TABLE1 WHERE ($FLAG_one = TRUE) --any boolean condition
 UNION ALL
 SELECT * FROM DB2.TABLE1 WHERE  ($FLAG_one = FALSE) --any boolean condition

【讨论】:

我希望在 hive 查询本身内部具有这种灵活性,然后从外部设置一个标志来决定从哪个数据库中进行选择。【参考方案2】:
 INPUT_DATABASE = db1
 IF FLAG_one = TRUE and FLAG_two = FALSE THEN  INPUT_DATABASE = db2                                                                                                                                       
 INSERT OVERWRITE TABLE OUTPUT_DATABASE.TABLE_ONE                                                                                                                                      
 SELECT * FROM INPUT_DATABASE.TABLE_TWO

【讨论】:

是 hpl/sql 还是什么? INPUT_DATABASE、OUTPUT_DATABASE、FLAG_one 和 FLAG_two 都在属性文件中。我们不能使用 IF THEN 或 CASE 语句吗? folkstalk.com/2011/11/conditional-functions-in-hive.html 这在 Hive 中不起作用。条件函数可以用在select中,可惜不像你贴的。 HiveQL 不是过程语言 我明白了。我会改写成条件语句在select中的方式? 现在我明白你想要什么了。在我的回答中使用 UNION ALL + WHERE 条件(它可以是你的标志检查)

以上是关于是否可以选择从 Hive 中的哪个数据库中选择的主要内容,如果未能解决你的问题,请参考以下文章

替代递归运行Spark-submit作业

是否可以在选择完成之前设置列别名,使用 Linq to SQL

HIVE SQL:从庞大的数据库中仅选择一个值的最快方法是啥

Hive 选择行,其中 A 列中的字符串包含 B 列中的字符串

选择 hive 中的下一个非空字段

从 Hive 中的多个表中选择 count(*)