ゴール
ハイブテーブルに部分的に指定されたパーティションが存在するかどうかを確認しようとしています。
詳細
sourceとdateの 2 つのパーティション キーを持つテーブルがあります。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
2 つのクライアントは、部分的に指定されたパーティションを異なる方法で解釈しているようです。
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 コマンドの構文は何ですか?
フォローアップの質問: どうやってこれを理解しましたか?