複数テーブルのオペレーションを実現するDiscoverX

Databricks Labsで公開されていました。

https://github.com/databrickslabs/discoverx/tree/master#discoverx

DiscoverXを用いることで、複数テーブルに対するスキャンやSQLの適用を一度に行うことができます。

![](https://github.com/databrickslabs/discoverx/raw/master/docs/images/DiscoverX_Multi-table_operations.png)

:::note
**注意**
上のリンク先にも記載されているように、/databrickslabsのgithubアカウントで提供されているものは探索目的のためのものであり、DatabricksによるSLAを提供するものではありません。問題を発見した場合には、GitHubのIssueとして報告してください。
:::

# 要件

- Databricksワークスペース
- Unity Catalogサポート

# オペレーションの例

複数テーブルに対して同時にオペレーションが適用されます。

- **メンテナンス**
    - [全テーブルのVACUUM](https://github.com/databrickslabs/discoverx/blob/master/docs/Vacuum.md) ([サンプルノートブック](https://github.com/databrickslabs/discoverx/blob/master/examples/vacuum_multiple_tables.py))
    - 特定のカラムを持つテーブルに対してz-orderを用いたOPTIMIZE
    - 大量の小さなファイルを持つテーブルの検知 ([サンプルノートブック](https://github.com/databrickslabs/discoverx/blob/master/examples/detect_small_files.py)) 
    - ある期間でテーブルごとに書き込まれたデータ量の可視化
- **ガバナンス**
    - Presidioを用いたPII検知 ([サンプルノートブック](https://github.com/databrickslabs/discoverx/blob/master/examples/pii_detection_presidio.py))
    - [GDPRのアクセスの権利: 一度にすべてのテーブルからユーザーデータを抽出](https://github.com/databrickslabs/discoverx/blob/master/docs/GDPR_RoA.md)
    - [GDPRの削除の権利: 一度にすべてのテーブルからユーザーデータを削除](https://github.com/databrickslabs/discoverx/blob/master/docs/GDPR_RoE.md)
    - [すべてのカラムに対する検索](https://github.com/databrickslabs/discoverx/blob/master/docs/Search.md)
- **意味論に基づく分類**
    - [意味論のタイプによるカラムに対する意味論的分類](https://github.com/databrickslabs/discoverx/blob/master/docs/Semantic_classification.md): メール、電話番号、IPアドレスなど
    - [意味論タイプによるデータの選択](https://github.com/databrickslabs/discoverx/blob/master/docs/Select_by_class.md)
    - [意味論タイプによるデータの削除](https://github.com/databrickslabs/discoverx/blob/master/docs/Delete_by_class.md)
- **カスタム**
    - [複数テーブルに対する任意のSQLテンプレートの実行](https://github.com/databrickslabs/discoverx/blob/master/docs/Arbitrary_multi-table_SQL.md)

# ウォークスルー

```py
%pip install dbl-discoverx
```

```py
from discoverx import DX
dx = DX()
```

Welcomeメッセージが表示されます。
![Screenshot 2023-09-24 at 14.06.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2315dd45-4741-f1b4-9fa0-48280934b6d1.png)

上の`dx.scan(from_tables="*.*.*")`を実行すると、Unity Catalogメタストアの全カタログ、データベース、テーブルをスキャンするので、対象を絞ります。

```py
dx.scan(from_tables="takaakiyayoi_catalog.default.taka_qiita")
```
上の例では1つのテーブルのみを対象にしていますが、ワイルドカード(`*`)を使えば複数のテーブルを同時にスキャンすることができます。

[こちら](https://github.com/databrickslabs/discoverx/tree/master#available-functionality)に説明があるように、`scan`は意味論に基づく分類を行うために、ルールで定義された正規表現を用いてレイクハウスをスキャンします。
![Screenshot 2023-09-24 at 14.07.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/38bd0bf8-9f72-ec96-1b50-df16bd69363f.png)

結果から、一つの列がURLであると識別されたことがわかります。

なお、ビルトインのルールを確認することができます。クレジットカード番号、メールアドレス、IPアドレスなど。

```py
dx.display_rules()
```
![Screenshot 2023-09-24 at 14.11.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/46cdb114-8db9-171f-1f92-8ba2eb78804e.png)

複数のテーブルに任意のSQLを同時に適用することもできます。

```py
dx.from_tables("takaakiyayoi_catalog.covid.covid*")\
  .apply_sql("SELECT to_json(struct(*)) AS row FROM {full_table_name} LIMIT 1")\
  .execute()
```
![Screenshot 2023-09-24 at 14.13.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fe6ba5b4-29f8-9ea0-b021-9fdf101dce3d.png)

あとでPIIの特定もトライしてみます。

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)