Hive - 仅获取一个或多个 hive 表的最新分区

Posted

技术标签:

【中文标题】Hive - 仅获取一个或多个 hive 表的最新分区【英文标题】:Hive - fetch only the latest partition of one or more hive tables 【发布时间】:2018-10-31 12:51:38 【问题描述】:

我在 Hive 中有三个分区表(每年分区),所有表都有多个分区。作为我的要求的一部分,我将加入所有这三个表。现在我只想为最新的分区而不是之前创建的分区运行这个 sql。

我尝试在 where 子句中使用 max(partition),但似乎不受支持

我做了类似下面的事情(不是确切的代码。只是一个代码概念)

select
a.*,
b.*,
c.*
from table1 a
left join table2 b on a.ID = b.ID
left join table3 c on a.ID = c.ID
where
a.year = max(a.year) and
b.year = max(b.year) and
c.year = max(c.year)

我收到了这个错误

失败:SemanticException [错误 10128]:第 108:23 行尚不支持 UDAF 'max' 的位置

我可以将多个 where 子句与包含“从表中选择 max(year)”的子查询一起用于所有表,但这似乎不可行。关于如何实现这一点的任何想法?

更新 我尝试了具有以下条件的 where 子句,但似乎 where 子句中只支持一个 suq-query。不知道如何解决这个问题。感谢您对此的任何投入

where
a.year in (select max(year) from table1) and
b.year in (select max(year) from table2) and
c.year in (select max(year) from table3

【问题讨论】:

为什么你认为它不可行?我正在使用那个来获得最大值 好的。为了便于参考,我提到该表只有年份作为分区,但在实际情况下,它有更多的分区列,我有更多的表要加入。所以我认为这是不可行的。 表有多少分区类型有关系吗?这都是关于修改“where”子句的。此外,您的聚合函数(即最大值)应用于分区列,而不是通常的,所以即使速度在这里也不是问题 @mangusta 感谢您的意见。如果有任何性能差异,我会尝试相同并在此处发布。 @mangusta 我无法在 where 子句中引入多个子查询。更新了问题以包含更多详细信息。有什么想法吗? 【参考方案1】:

修改版:

    select
    <columns>
    from  
    (  
     select 
     <columns> 
     from 
     table1 a 
     where a.year in (select max(year) from table1) 
    ) a1
    left join 
    (
     select 
     <columns> 
     from 
     table2 b 
     where b.year in (select max(year) from table2) 
    ) b1 on a1.ID = b1.ID
    left join 
    (
     select 
     <columns> 
     from 
     table3 c 
     where c.year in (select max(year) from table3) 
    ) c1 on a1.ID = c1.ID
;

【讨论】:

以上是关于Hive - 仅获取一个或多个 hive 表的最新分区的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 rank 函数获取 hive 中的最新记录

hive---实践

在 Hive 中获取最后一个工作日的第 15 个日期-yyyyMMdd(仅周末除外)

我们可以检查 hive 删除表的历史记录或它周围的详细信息吗?

如何生成hive的建表语句

怎么通过clouder manager去查看 hive语句