【问题标题】:Use result of a Hive/Impala query inside another query在另一个查询中使用 Hive/Impala 查询的结果
【发布时间】:2018-06-20 15:43:56
【问题描述】:

我正在使用 hive/impala,我经常需要查询 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(hive 和 impala)中执行此操作。 这可能吗?

【问题讨论】:

    标签: hive impala hue


    【解决方案1】:

    我认为您在 impala/hive 中直接尝试的操作是不可能的。

    我可以建议另一种方法:

    结合 impala/hive 使用 bash 所以不要在 hive 和 impala 中进入交互模式,而是使用命令行选项从 bash shell 本身传递查询,以便结果返回到 bash shell,然后使用 grep 或其他文本处理命令来处理它。

    看起来像

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

    这里你需要用所需的值代替

    所以通过这种方式,您可以使用 grep/sed 或其他工具来获得所需的输出。 显然,这取决于您的用例您到底想要什么..但我希望这会有所帮助

    【讨论】:

    • 你还需要把 .tbl1 放在提到的查询中
    • 我一直在使用与hiveimpala-shellbash 类似的方法,但比我想要的次数更多,我必须使用hue 所以我在寻找对于对两种环境都有效的方法。谢谢
    【解决方案2】:

    如果有人发现这很有用,这就是我最终要做的。假设您有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])并将数据帧按 / 拆分,然后对于每个部分,拆分为 = 并获取值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多