目标
我正在尝试检查配置单元表中是否存在部分指定的分区。
细节
我有一个带有两个分区键source和date的表。在执行任务之前,我需要检查是否存在某个分区date
(source
未指定)。
尝试
我可以使用 luigi 的内置 hive 分区目标和默认客户端轻松完成此操作:
>>> import luigi.hive as hive
>>> c = hive.HivePartitionTarget('data',{"date":"2016-03-31"})
>>> c.exists()
True
>>> c = hive.HivePartitionTarget('data',{"date":"2016-03-32"})
>>> c.exists()
False
但是默认客户端非常非常慢,因为它正在启动 hive 的命令行实例并运行查询。所以我尝试将默认客户端换成节俭的客户端,这发生了:
>>> d = hive.HivePartitionTarget('data',{"date":"2016-03-31"}, client=hive.MetastoreClient())
>>> d.exists()
False
看起来这两个客户端对部分指定的分区的解释不同。
我已经编写了自己的客户端,它继承自 MetastoreClient 并添加了一些我过去需要的附加功能,所以我不介意添加我自己设计的部分指定的分区检查。看起来客户端具有我需要的功能:
>>> from pprint import pprint
>>> import luigi.hive as hive
>>> client = hive.HiveThriftContext().__enter__()
>>> pprint([command for command in dir(client) if 'partition' in command])
[ # Note: I deleted the irrelevant commands, this was a really long list
'get_partition',
'get_partition_by_name',
'get_partition_names',
'get_partition_names_ps',
'get_partition_with_auth',
'get_partitions',
'get_partitions_by_filter',
'get_partitions_by_names',
'get_partitions_ps',
'get_partitions_ps_with_auth',
'get_partitions_with_auth',
# Even more commands snipped here
]
看起来该命令get_partitions_by_filter
可能完全符合我的要求,但除了自动生成的预期类型列表之外,我在任何地方都找不到任何文档。而且我在使用更简单的函数时遇到了类似的问题:当我完全指定我知道存在的分区时,我无法获取get_partition
或get_partition_by_name
找到它们。我确信这是因为我没有以正确的格式提供参数,但我不知道正确的格式是什么,而且我的耐心已经耗尽了猜测。
HiveThriftContext 的 get_partitions_by_filter 命令的语法是什么?
后续问题:您是如何解决这个问题的?