如何在HIVE表中找到最新的分区

时间:2016-03-18 23:12:45

标签: hadoop apache-spark hive

我有一个分区表 - 有201个分区。 我需要在此表中找到最新的分区,并使用它来处理我的数据。查找所有分区列表的查询是:

use db;
show partitions table_name; 

我需要一个查询来查找最新的这些分区。分区格式为

ingest_date=2016-03-09

我尝试使用max(),这给了我一个错误的结果。我不想通过

遍历整个表格
select max(ingest_date) from db.table_name; 

这会给我预期的输出..但是杀死了第一位有分区的重点。

是否有更高效的查询来获取HIve表的最新分区?

4 个答案:

答案 0 :(得分:5)

您可以使用“show partitions”:

hive -e "set hive.cli.print.header=false;show partitions table_name;" | tail -1 | cut -d'=' -f2

这将为您提供“2016-03-09”作为输出。

答案 1 :(得分:2)

如果您要避免像上面建议的那样在配置单元外壳程序中运行“显示分区”,则可以将过滤器应用于max()查询。这样可以避免进行全表扫描,并且结果应相当快!

select max(ingest_date) from db.table_name where ingest_date>date_add(current_date,-3)仅扫描2-3个分区。

答案 2 :(得分:0)

似乎无法通过仅检查元数据的Hive(或beeline)CLI查询最后一个分区(正如人们所期望的那样)。

出于完整性考虑,我对bash解析答案提出的另一种选择是直接查询元存储库,可以轻松地扩展到ingest_date的更复杂功能,而不仅仅是取最大值。例如,对于我使用过的MySQL metastore:

SELECT MAX(PARTITIONS.PART_NAME) FROM
DBS
INNER JOIN
TBLS ON DBS.DB_ID = TBLS.DB_ID
INNER JOIN
PARTITIONS ON TBLS.TBL_ID = PARTITIONS.TBL_ID
PARTITIONS DBS.NAME = 'db'
PARTITIONS TBLS.TBL_NAME = 'my_table'

然后输出将为partition_name=partition_value格式。

答案 3 :(得分:0)

如果您知道您的表在hdfs中的位置。这是最快的方法,甚至不需要打开蜂巢壳。

您可以使用命令在hdfs中检查表位置;

show create table <table_name>

然后

hdfs dfs -ls <table_path>| sort -k6,7 | tail -1

它将显示hdfs中的最新分区位置