Hive: 如何显示表的所有分区?

我有一个包含1000多个分区的表。

Show partitions”命令只列出少量分区。

如何显示所有分区?

更新:

  1. 我发现“ show partitions”命令只列出了500个分区。

  2. select ... where ...”只处理500个分区!

226341 次浏览

当显示输出时,CLI 有一些限制。我建议将输出导出到本地文件:

$hive -e 'show partitions table;' > partitions

您可以在“ PARTITION”表中看到 Hive MetaStore 表、 PARTITIONS 信息。 您可以使用“ TBLS”连接“ Partition”来查询特殊的表分区。

好的,我通过扩展上面的 wmky 答案来写这个答案,同时假设您已经为您的元存储配置了 mysql,而不是 derby。

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)

返回所有分区列。

注意: JOINDBS ON DB_ID当涉及到一个数据库时(即,当多个数据库具有相同的 table _ name 时)

Hive > show Partitions table _ name;

还有一种选择是通过节俭协议与蜂巢超级商店进行通信。
如果您使用 python 编写代码,您可能会从 Hmsclient库中受益:

蜂巢:

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

巨蟒剧情介绍:

>>> 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 短最大值)的参数。

如果你把 Airflow 和 apache.hive额外安装在一起,创建 hmsclient非常简单:

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

这似乎是一种比直接访问数据库更有效的与蜂巢元存储通信的方式(以及与数据库引擎无关的 BTW)。