71

1000 以上のパーティションを持つテーブルがあります。

" Show partitions" コマンドは少数のパーティションのみを一覧表示します。

すべてのパーティションを表示するにはどうすればよいですか?

アップデート:

  1. show partitions」コマンドでは正確に 500 個のパーティションしか一覧表示されないことがわかりました。

  2. " select ... where ..." は 500 個のパーティションしか処理しません!

4

5 に答える 5

92

CLI では、出力の表示に制限があります。出力をローカル ファイルにエクスポートすることをお勧めします。

$hive -e 'show partitions table;' > partitions
于 2013-03-25T13:42:27.230 に答える
4

さて、ダービーの代わりにメタストア用にmysqlを構成したと仮定して、上記のwmkyの回答を拡張してこの回答を書いています。

select PART_NAME FROM PARTITIONS WHERE TBL_ID=(SELECT TBL_ID FROM TBLS WHERE TBL_NAME='<table_name>');

上記のクエリは、パーティション列のすべての可能な値を提供します。

例:

hive> desc clicks_fact;
OK
time                    timestamp                                   
..                              
day                     date                                        
file_date               varchar(8)                                  

# Partition Information      
# col_name              data_type               comment             

day                     date                                        
file_date               varchar(8)                                  
Time taken: 1.075 seconds, Fetched: 28 row(s)

パーティション列の値をフェッチします。

mysql> select PART_NAME FROM PARTITIONS WHERE TBL_ID=(SELECT TBL_ID FROM TBLS WHERE TBL_NAME='clicks_fact');
+-----------------------------------+
| PART_NAME                         |
+-----------------------------------+
| day=2016-08-16/file_date=20160816 |
| day=2016-08-17/file_date=20160816 |
....
....
| day=2017-09-09/file_date=20170909 |
| day=2017-09-08/file_date=20170909 |
| day=2017-09-09/file_date=20170910 |
| day=2017-09-10/file_date=20170910 |
+-----------------------------------+

1216 rows in set (0.00 sec)

すべてのパーティション列を返します。

注: DB が関係している場合 (つまり、複数の DB が同じ table_name を持っている場合) にJOINテーブルをDBSオンにします。DB_ID

于 2017-09-12T11:49:23.380 に答える
0

さらに別のオプションは、Thrift プロトコルを介して Hive メタストアと通信することです。
Python でコードを記述する場合は、hmsclientライブラリが役立つ場合があります。

ハイブ cli:

hive> create table test_table_with_partitions(f1 string, f2 int) partitioned by (dt string);
OK
Time taken: 0.127 seconds

hive> alter table test_table_with_partitions add partition(dt=20210504) partition(dt=20210505);
OK
Time taken: 0.152 seconds

Python クリ:

>>> from hmsclient import hmsclient
>>> client = hmsclient.HMSClient(host='hive.metastore.location', port=9083)
>>> with client as c:
...    all_partitions = c.get_partitions(db_name='default',
...                                      tbl_name='test_table_with_partitions', 
...                                      max_parts=24 * 365 * 3)
...
>>> print([{'dt': part.values[0]} for part in all_partitions])
[{'dt': '20210504'}, {'dt': '20210505'}]

注意:max_partsは、32767 (java short max value) を超えることができないパラメータです。

エクストラと一緒に Airflow をインストールしている場合は、非常に簡単apache.hiveに作成できます。hmsclient

hive_hook = HiveMetastoreHook()
with hive_hook.metastore as hive_client:
    ... your code goes here ...

これは、DB に直接アクセスするよりも Hive メタストアと通信するためのより有効な方法のようです (データベース エンジンに依存しません)。

于 2021-05-17T13:37:58.110 に答える