特徴量エンジンKaskada基礎~テーブルへのデータのロード

# はじめに

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

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

新しいテクノロジーに触れる時はいつでも楽しいものです。
中でも新しいプログラミング言語（のパラダイム）を学ぶことは、特別に楽しいことです。

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

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


https://kaskada.io/docs-site/kaskada/main/loading-data.html

# テーブルへのデータのロード
Kaskada はデータをテーブル形式で保持します。テーブルは複数の行で構成され、各行は同じ型の値です。

テーブルの詳細は、リファレンスの下記項目で確認できます。

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


Kaskadaのテーブルに、データをロードする前に、Kaskadaに対してテーブルを定義しておく必要があります。

テーブルにロードされるデータには、テーブル定義で使用されるすべての列が含まれている必要があります。（現時点では）テーブルにロードされるすべてのデータは同じスキーマを持つ必要があります。

さらに、次のことが期待されます。

 - time 列 (およびデータセット内の他のすべての日時列) は、`timestamp`型にキャストできる型(たとえば、整数または RFC3330 形式の文字列) である必要があります。
 - サブソート列が定義されている場合、エンティティ キー列、時間列、およびサブソート列の組み合わせにより、各行が一意である必要があります。

以下は、Parquet ファイルからKaskadaのテーブルに、データをロードする例です。

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

session = LocalBuilder().build()

table.load(
  table_name = "Purchase",
  file = "/path/to/file.parquet",
)
```
ここでは、Parquetファイルが使われています。Kaskadaで、サポートされるフォーマットについては後述します。

データをロードした結果(`load`の戻り値)は、以下のように`data_token_id`になります。

```
data_token_id: "aa2***a6b9"
```

データ トークン ID は、現在 Kaskada に保存されているデータへの一意の参照です。データ トークンにより反復可能なクエリが可能になります。同じデータ トークンに対して実行されるクエリは、常に同じ入力データに対して実行されます。

## サポートされている形式

Apache Parquet は、効率的なデータの保存と取得のために設計されたオープンソースの列指向のデータ ファイル形式です。Parquetは、Kaskadaで扱うような大量のイベントデータの扱いに適しています。


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

session = LocalBuilder().build()

table.load(
  table_name = "Purchase",
  file = "/path/to/file.parquet",
)
```
Python ライブラリは、ファイルのパスの拡張子からファイルの形式を推測します。Parquet ファイル名は`.parquet`で終わる必要があります。

## CSV
カンマ区切り値 (CSV) ファイルは、値をカンマで区切る区切りテキスト ファイルです。ファイルの各行はデータ レコードです。

CSV ファイルには、ファイルのスキーマを推測するために使用されるヘッダー行が含まれている必要があります。CSV 型の推論は、データのロード時に行われます。スキーマは、最初の 1000 行を読み取ることによって推論されます。



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

session = LocalBuilder().build()

table.load(
  table_name = "Purchase",
  file = "/path/to/file.csv",
)
```

Python ライブラリは、ファイルのパスの拡張子からファイルの形式を推測します。CSV ファイル名は`.csv` で終わる必要があります。

## ファイルの場所
Kaskada は、さまざまな種類のファイル ストレージからのファイルのロードをサポートしています。ファイル ストレージ システムは、ファイル パス プロトコル プレフィックス (たとえば、`file:`または `s3:`)を使用して指定されます。

### ローカルストレージ
`file:`プロトコルを使用してローカル ディスクからデータをロードできます。ディスクからロードする場合、ファイル パスは Kaskadaサービスからアクセスできる必要があります。

リモート Kaskada サービスを使用する場合、ローカル ストレージは推奨されません。

### AWS S3ストレージ
`s3:`プロトコルを使用して、AWS S3 (または Minio などの互換ストア) からデータをロードできます。S3 から非公開オブジェクトをロードする場合は、Kaskada サービスに認証情報を設定する必要があります。資格情報は環境変数を使用して構成されます。

次の環境変数は、資格情報の構成に使用されます。

 - `AWS_ACCESS_KEY_ID`: AWS 認証情報キー。
 - `AWS_SECRET_ACCESS_KEY`: AWS 認証情報のシークレット。
 - `AWS_DEFAULT_REGION`: 指定されていない場合に使用する AWS S3 リージョン。
 - `AWS_ENDPOINT`: 接続先の S3 エンドポイント。
 - `AWS_SESSION_TOKEN`: セッショントークン。セッション トークンは、IAM ロールを引き受けることによって作成された認証情報に必要です。
 - `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`: 詳細は、左記ページ参照 https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html
 - `AWS_ALLOW_HTTP`: TLS を使用しない HTTP 接続を許可するには、「true」に設定します。

### GCP GS ストレージ
`gs:`プロトコルを使用して GCP GS からデータをロードできます。AWS S3 ストレージ構成と同様に、Kaskada サービスは認証情報を使用して構成する必要があります。

次の環境変数は、資格情報の構成に使用されます。
 * `GOOGLE_SERVICE_ACCOUNT`: サービス アカウント ファイルの場所
 * `GOOGLE_SERVICE_ACCOUNT_PATH`: (エイリアス) サービス アカウント ファイルの場所 
 * `SERVICE_ACCOUNT`: (エイリアス) サービス アカウント ファイルの場所
 * `GOOGLE_SERVICE_ACCOUNT_KEY`: JSON でシリアル化されたサービス アカウント キー