はじめに
こんにちは、KCCS デジタルプラットフォーム部の松村です。
私たちの部門ではDatabricksを活用したデータ分析基盤の構築や技術検証、Databricksの構築における課題の解決を行なっています。
本記事では、Databricksでスキーマ推論を利用したデータ取り込み処理の簡略化について紹介します。
スキーマ推論
スキーマ推論とは、読み込まれたデータの定義をDatabricksが自動で検出する機能となります。
この機能を利用すれば、データを読み込み処理を開発するにあたって、データの定義を個別に設定せずともDataframeやテーブル定義に反映させることができます!
公式リファレンスはこちら
利用方法
利用用法は至って単純、データの読み込み時にinferSchemaのオプションをTrueで追加するだけです。
※inferSchemaはデフォルトでFalseのため、明示的にTrueでの指定が必要です。
今回はcsvファイルの読み込みで利用しました。
df = spark.read.csv(<読み込みファイルのパス>, inferSchema=True)
実検証
Databricksボリュームにcsvファイルを配置し、notebookからデータ定義を自動で読み込めるのか検証してみました。
配置したcsvファイルはIDと氏名、年齢が書かれているファイルを配置しています。
ファイルの中身は以下の通りです。
(※値はAI生成であり実在する人物ではありません)
ID,氏名,年齢
1,佐藤太郎,28
2,鈴木花子,34
3,高橋次郎,22
4,田中美咲,30
5,中村健一,45
6,小林涼子,29
7,加藤健太,52
8,山田奈々,31
9,斎藤一郎,40
10,藤田恵美,26
notebookの記載は以下の通りです。
※ファイルにヘッダーがあるため、ヘッダーオプションも追加しました。
df = spark.read.csv("/Volumes/matsumura_catalog/test_schema/test/meibo.csv", header=True, inferSchema=True)
display(df)
結果は以下の通りです。
Dataframe上でヘッダーと値から自動で列名とデータ型が設定されていることがわかります。
| 項目 | データ型 |
|---|---|
| ID | Int |
| 氏名 | String |
| 年齢 | Int |
テーブルへの書き込みを行い、テーブルからデータを取得しても同じ結果が得られました。

Unity CatalogのUI上でも同じくカラムが自動で設定されていることが確認できました。

inferSchemaをTrueにしなかった場合
inferSchemaオプションをつけずに読み込んだ場合は全てString型として読み込まれます。

まとめ
スキーマ推論を利用し、簡単にDBへの取り込み処理を作りました。
スキーマ推論を利用すれば、膨大な数のファイル取り込みが必要な際に、データ型を細かく指定せずとも取り込み処理を共通化させて短時間で開発が可能になります。
ヘッダーのあるなしやセパレーター、ファイル形式の指定などは設定ファイルで別途管理することで、1カラムのIDはデータ型をintで〜と全カラムのデータ型を指定するように細かく書き起こさずとも開発することができるので、開発工数の圧縮につながると思います。
ただし、推論が必ずしも正しいとは言い切れないので、データを守るためにもパイプライン処理の中でデータ品質チェックにて値の確らしさをチェックが必要です。
取り込むだけのデータは良いですが、パイプラインによる加工・集計に利用されるデータに関してはチェックが必要だと思います。
※AIの判断に頼り切らず、人の手によるチェックも必要かと考えています。
おまけ
データの型を自動で判別してくれているようですが、値のバリエーションから判断するのか試してみました。
年齢のカラムがIntになっていましたが、値を変えた場合にデータ型がどう変わるのかを検証してみました。
検証パターンは以下の通りです。
| パターン | 検証 |
|---|---|
| 1 | 全件の年齢をXX.50にした場合 |
| 2 | 全件の年齢をXX歳にした場合 |
| 3 | 1件だけ年齢をXX.50にした場合 |
| 4 | 1件だけ年齢をXX歳にした場合 |
パターン1:全件の年齢をXX.50にした場合
パターン2:全件の年齢をXX歳にした場合
パターン3:1件だけ年齢をXX.50にした場合
1件だけ例外があったとしても年齢のカラムがきちんとDoubleに変わりました。

パターン4:1件だけ年齢をXX歳にした場合
1件だけ例外があったとしても年齢のカラムがきちんとStringに変わりました。

どのパターンでもきちんと値によって定義を正しく認識することができました。
含まれている値のバリエーションによってなかなかの精度で判定できているようです。


