はじめに
先日、以下の記事を発表しました。
公式ドキュメントの学習過程の記録として、以下の記事をまとめてみました。
本稿情報のソースとして、下記ドキュメントを参照ください。
Pythonでのクエリ実行
Pythonプログラムでは、以下のようにクエリを作成し、実行することができます。
from kaskada import compute
from kaskada.api.session import LocalBuilder
session = LocalBuilder().build()
query = """{
time: Purchase.purchase_time,
entity: Purchase.customer_id,
max_amount: last(Purchase.amount) | max(),
min_amount: Purchase.amount | min()
}"""
response_parquet = compute.query(query = query).output_to.object_store.output_paths[0]
上記では、クエリの結果をParguetファイルとして出力しています。
このファイルを使って、以下のように、クエリの結果をPandasのデータフレームとして利用することもできます。
# (Optional) view results as a Pandas dataframe.
import pandas
pandas.read_parquet(response_parquet)
Pythonオプションパラメータ
Python から直接クエリを実行する場合、次のオプションパラメーターを使用できます。
-
with_tables
: クエリで使用するテーブルのリスト(システムに保存されているテーブルへの追加指定として) -
with_views
: クエリで使用するビューのリスト(システムに保存されているビューへの追加指定として) -
result_behavior
: 以下のどのresult_behavior
タイプのクエリ実行結果が返されるかを決定します。(以下で具体的に説明します。)-
all-results
(デフォルト) final-results
-
-
response_as
: 応答がどのように返されるかを決定します。-
parquet
(デフォルト) -
redis-bulk
: この場合、result_behavior
は 自動的に、final-results
であるとみなされます
-
-
data_token_id
: 反復可能なクエリを有効にします。- 同じデータ トークンに対して実行されるクエリは、常に同じ入力データに対して実行されます。
-
limits
: 出力セットの制限を構成します。
result_behavior
詳説:Kaskadaクエリの2種類の計算結果取得方法
Kaskadaでは、同じクエリの実行結果として、2つの異なる種類の計算結果取得方法が存在します。
それは、(特定の時点の) 最終結果 (final results) 、または 全履歴結果(all historic results) のいずれかです。「タイムライン履歴(timeline history)」とも言います。
そして、クエリ実行時に、それらのどちらの種類の結果を生成するか(いうならば「結果の振る舞い(result behavior)」)を選択することになります。
- 全履歴結果(all historic results) では、各エンティティの値が時間の経過とともにどのように変化したかに関する完全な履歴が返されます。
- (特定の時点の) 最終結果 (final results) では、指定された時点 (デフォルトはすべてのイベントが処理された後) での各エンティティの最新の結果を返します。「スナップショット」とも言います。
クエリ時にresult_behavior
設定を使用して、どちらのタイプを実行するかを決定します。明示的に指定しない場合、デフォルトでは、全履歴結果(all historic results) となります。 最終結果(final results) に変更するには、create_query
メソッドのオプションとして、result_behavior="final-results"
を与えます。
from kaskada import compute
query = """{
time: Purchase.purchase_time,
entity: Purchase.customer_id,
max_amount: last(Purchase.amount) | max(),
min_amount: Purchase.amount | min()
}"""
resp = query.create_query(expression=query, result_behavior="final-results")