【问题标题】:Hive partitioning not working with dynamic variableHive 分区不适用于动态变量
【发布时间】:2016-08-31 22:18:33
【问题描述】:

如果我跑

set hivevar:a = 1;
select * from t1 where partition_variable=${a};

Hive 仅从适当的分区中提取记录。 或者,如果我运行

set hivevar:b = 6;
set hivevar:c = 5;
set hivevar:a = ${b}-${c};
select * from t1 where partition_variable=${a};

partition_variable 上的条件被视为谓词而不是分区,并且 hive 会遍历表中的所有记录。

这显然是一个人为的例子,但在我的特定用例中是必要的。是否有强制 hive 使用它进行分区?

提前致谢。

【问题讨论】:

    标签: hadoop mapreduce hive tez


    【解决方案1】:

    分区变量是发生分区的列。它适用于以下。

    create table newpart
    (productOfMonth string)
    partitioned by (month int);
    
    
    hive> select * from newpart;
    OK
    Cantaloupes 10 
    Pumpkin     11
    
    set hivevar:lastmonth = 11;
    set hivevar:const = 1;
    set hivevar:prevmonth = ${lastmonth}-${const};
    
    hive> select * from newpart
        > where month = ${prevmonth};
    OK
    Cantaloupes 10
    

    【讨论】:

    • partition_variable 是发生分区的列。问题不在于它是否有效,实际上它会返回正确的答案。问题是它使用partition_variable 作为谓词,而不是只查看正确的分区。因此,它可以查看几乎 10000 倍所需的记录数。
    • 能否提供解释方案?
    【解决方案2】:

    我无法让分区与动态生成的 hive 变量一起正常工作,但一个简单的解决方法是创建一个包含变量的表并加入它们,而不是在 where 子句中使用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      相关资源
      最近更新 更多