在另一个查询中使用Hive / Impala查询的结果

时间:2018-06-20 15:43:56

标签: hive impala hue

我正在使用蜂巢/黑斑羚,经常遇到需要查询show partition的结果来获取特定分区的需求。假设我有一个表tbl1,该表由字段countrydate划分。因此,show partitions tbl1将导致类似

country=c1/date=d1
country=c1/date=d3
country=c2/date=d2

我想做类似select * from (show partitions tbl1) a where a.country='c1'的事情,并且我想在Hue或shell(蜂巢和黑斑羚)中这样做。 这可能吗?

2 个答案:

答案 0 :(得分:0)

我认为直接在impala / hive中不可能实现您正在尝试的事情。

我可以建议另一种方法:

结合使用bash和impala / hive 因此,与其使用蜂巢和黑斑羚进入交互模式,不如使用命令行选项从bash shell本身传递查询,以使结果返回bash shell,然后使用grep或其他文本处理命令进行处理。

所以看起来像

impala -k -i <> --ssl -ca_cert <> -B -q "show partitions tbl1" | grep "country=c1"

在这里,您需要将所需的值替换为<>

因此您可以使用grep / sed或其他工具来获得所需的输出。 显然,这取决于您的用例,您究竟想要什么。.但我希望这可以有所帮助

答案 1 :(得分:0)

如果有人发现这很有用,这就是我最终要做的。假设您拥有spark-shellspark2-shell,则可以将show partitions的输出存储在一个数据框中,然后转换该数据框。这就是我所做的(在spark2-shell内部:

val df = spark.sql("show partitions tbl1").map(row => {
    val arrayValues = row.getString(0).split("/")
    (arrayValues.head.split("=")(1), arrayValues(1).split("=")(1))
}).toDF("country", "date")

这将获取分区列表(一个DataFrame [String]),然后将数据帧除以/,然后对于每一段,将其分割为=,并取值