パーティションテーブルがあります-201パーティション。このテーブルで最新のパーティションを見つけ、それを使用してデータを後処理する必要があります。すべてのパーティションのリストを検索するクエリは次のとおりです。
use db;
show partitions table_name;
これらのパーティションの最新のものを見つけるためのクエリが必要です。パーティションはフォーマットです
ingest_date=2016-03-09
間違った結果が出るmax()を使用してみました。実行してテーブル全体を行き来したくない
select max(ingest_date) from db.table_name;
これは私に予想される出力を与えます。
Hiveテーブルの最新のパーティションを取得するためのより効率的なクエリはありますか?
「show partitions」を使用できます:
Hive -e "set Hive.cli.print.header=false;show partitions table_name;" | tail -1 | cut -d'=' -f2
これにより、「2016-03-09」が出力されます。
上記のようにHiveシェルで「パーティションの表示」を実行したくない場合は、max()クエリにフィルターを適用できます。これにより、フルテーブルスキャンが回避され、結果はかなり速くなります。
select max(ingest_date) from db.table_name where ingest_date>date_add(current_date,-3)
は、2〜3個のパーティションのみをスキャンします。
(当然のことながら)メタデータのみをチェックする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
の形式になります。
hdfsでテーブルの場所がわかっている場合。これは、Hive Shellを開かなくても最も簡単な方法です。
コマンドを使用してhdfsのテーブルの場所を確認できます。
show create table <table_name>
その後
hdfs dfs -ls <table_path>| sort -k6,7 | tail -1
Hdfsに最新のパーティションの場所が表示されます