特徴量エンジンKaskadaリファレンス~ビュー

# はじめに

先日、以下の記事を発表しました。

https://qiita.com/yoshiyuki_kono/items/7dc7bdad5e02ff986f5d

新しいテクノロジーに触れる時はいつでも楽しいものです。

まだまだ勉強中ですが、公式ドキュメントの学習過程の記録として、以下の記事をまとめてみました。

本稿情報のソースとして、下記ドキュメントを参照ください。

https://kaskada.io/docs-site/kaskada/main/developing/views.html

# ビュー
Fenl 式は、**ビュー**を作成し、共有・再利用することできます。
ビューは**名前付きの式**です。ビュー定義により、それに続くFenl 式では、ビューの名前はビューの式と同義になります。
ビューは Kaskada マネージャーに保持され、あらゆるクエリからアクセスできます。

ビューを作成したら、Fenl内で、そのビューの式を使用できる場所ならどこでも、ビューの名前を用いて、式を使用することができます。ビューに課される唯一の制限は、ビューが有効なFenl式であることです。
また、ビュー内部では他のビューを参照することもできます。

ビューは、式を共有または再利用する必要がある場合、例えば以下のようなケースで、役立ちます。

 - 一般的なビジネス ロジック
 - ML 機能の定義
 - クリーニングオペレーション

## ビューの管理
### ビューの作成
ビューを作成するには、名前を付ける式を記述することから始めます。

この場合、各ユーザーの購入統計に興味があります。 

```python
from kaskada import view
from kaskada.api.session import LocalBuilder

session = LocalBuilder().build()

view.create_view(
    view_name = "PurchaseStats",
    expression = "{
        time: Purchase.purchase_time,
        entity: Purchase.customer_id,
        max_amount: Purchase.amount | max(),
        min_amount: Purchase.amount | min(),
    }"
)
```

以下は、上記のPythonプログラムと同内容の処理をCLIで実行する例です。

```shell
kaskada-cli view create PurchaseStats \
    "{time: Purchase.purchase_time,entity: Purchase.customer_id,max_amount: Purchase.amount | max(),min_amount: Purchase.amount | min()}"
```
これにより、ビュー`PurchaseStats`が作成されます。

### Kaskadaにおける慣用
Kaskadaではビュー名にキャメルケースを使用することが好まれます。これはテーブルに使用するものと同じ命名規則であり、クエリの一部として作成される一時的なローカル値ではなく、Kaskada システム内の永続リソースを参照していることを伝えるのに役立ちます。

## IPython/Jupyterコードブロックでの定義

IPython/Jupyter を使用している場合は、`--var`引数を`%%fenl`コマンドに使用してブロックの内容からビューを作成できます。

```
%%fenl --var purchase_stats
{
    time: Purchase.purchase_time,
    entity: Purchase.customer_id,
    max_amount: Purchase.amount | max(),
    min_amount: Purchase.amount | min(),
}
```

先頭行（マジック ブロック）に`--var purchase_stats`を追加すると、ブロックの実行時にクエリ結果を変数`purchase_stats`に割り当てます。

この変数を使用すると、式を再入力することなく、Python クライアントを使用してビューを作成できます。

```python
from kaskada import view
from kaskada.api.session import LocalBuilder

session = LocalBuilder().build()

view.create_view(
    view_name = "PurchaseStats",
    expression = purchase_stats.expression,
)
```



## リストビュー
`list_views` メソッドは、ユーザーに対して定義されたすべてのビューを返します。オプションの検索文字列を使用して、レスポンスをフィルタリングできます。

リストビューの例を次に示します。


```python
from kaskada import view
from kaskada.api.session import LocalBuilder

session = LocalBuilder().build()

view.list_views()
```

以下は、上記のPythonプログラムと同内容の処理をCLIで実行する例です。

```
kaskada-cli view list
```


### ビューの取得
名前を使用してビューを取得できます。


```python
from kaskada import view
from kaskada.api.session import LocalBuilder

session = LocalBuilder().build()

view.get_view("PurchaseStats")
```

以下は、上記のPythonプログラムと同内容の処理をCLIで実行する例です。

```
kaskada-cli view get PurchaseStats
```

### ビューの更新
ビューは現在不変です。ビューを更新するには、そのビューを削除してから再作成する必要があります。

### ビューの削除
ビューは、その名前を使用して削除できます。



```python
from kaskada import view
from kaskada.api.session import LocalBuilder

session = LocalBuilder().build()

view.delete_view("PurchaseStats")
```

以下は、上記のPythonプログラムと同内容の処理をCLIで実行する例です。

```
kaskada-cli view delete PurchaseStats
```

削除されたビューに対して、別のビューやマテリアライゼーションがそのビューを参照していると、失敗し前提条件エラーが返されます。ビューの削除を続行するには、別の削除操作で依存リソースを手動で削除するか、ビューを強制的に削除する`force`フラグを指定します。依存リソースを削除せずにビューを強制的に削除すると、依存リソースが誤って機能する可能性があります。


```python
from kaskada import view
from kaskada.api.session import LocalBuilder

session = LocalBuilder().build()

view.delete_view("PurchaseStats", force = True)
```

以下は、上記のPythonプログラムと同内容の処理をCLIで実行する例です。

```
kaskada-cli view delete PurchaseStats --force
```