web-dev-qa-db-ja.com

Hiveテーブルで最新のパーティションを見つける方法

パーティションテーブルがあります-201パーティション。このテーブルで最新のパーティションを見つけ、それを使用してデータを後処理する必要があります。すべてのパーティションのリストを検索するクエリは次のとおりです。

use db;
show partitions table_name; 

これらのパーティションの最新のものを見つけるためのクエリが必要です。パーティションはフォーマットです

ingest_date=2016-03-09

間違った結果が出るmax()を使用してみました。実行してテーブル全体を行き来したくない

select max(ingest_date) from db.table_name; 

これは私に予想される出力を与えます。

Hiveテーブルの最新のパーティションを取得するためのより効率的なクエリはありますか?

13
underwood

「show partitions」を使用できます:

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

これにより、「2016-03-09」が出力されます。

5
pkgajulapalli

上記のようにHiveシェルで「パーティションの表示」を実行したくない場合は、max()クエリにフィルターを適用できます。これにより、フルテーブルスキャンが回避され、結果はかなり速くなります。

select max(ingest_date) from db.table_name where ingest_date>date_add(current_date,-3)は、2〜3個のパーティションのみをスキャンします。

4
Kash

(当然のことながら)メタデータのみをチェックするHive(またはbeeline)CLIを介して最後のパーティションをクエリする方法がないようです。

完全を期すために、私がbash解析の回答に提案する代替案は、メタストアに直接クエリを実行する方法です。これは、最大値を取るだけでなく、ingest_dateのより複雑な関数に簡単に拡張できます。たとえば、私が使用したMySQLメタストアの場合:

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の形式になります。

0
josoler

hdfsでテーブルの場所がわかっている場合。これは、Hive Shellを開かなくても最も簡単な方法です。

コマンドを使用してhdfsのテーブルの場所を確認できます。

show create table <table_name>

その後

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

Hdfsに最新のパーティションの場所が表示されます

0
Strick