半構造化データ用のバリアントと呼ばれる新しいデータ型を発表できることを嬉しく思います。 バリアント(Variant) は、これらのデータを JSON 文字列として保存する場合と比べて、パフォーマンスが桁違いに向上すると同時に、高度にネストされ進化するスキーマをサポートするための柔軟性も維持します。
半構造化データの取り扱いは、長い間レイクハウスの基盤的な機能の一つです。エンドポイント検出と対応(EDR)、広告クリック分析、IoTテレメトリーなどは、半構造化データに依存する人気のユースケースの一部です。私たちがより多くの顧客を専有のデータウェアハウスから移行させる中で、彼らが専有のデータウェアハウスで提供されるバリアントデータ型に依存していることを聞き、 ロックインを避けるためにオープンソース標準が欲しいという声がありました。
オープンバリアントタイプは、Apache SparkオープンソースコミュニティとLinux Foundation Delta Lakeコミュニティの両方とのコラボレーションの結果です:
- バリアントデータ型、バリアントバイナリ式、バリアントバイナリエンコーディング形式は、すでにオープンソースのSparkにマージされています。バイナリエンコーディングの詳細はこちらで確認できます。
- バイナリエンコーディング形式は、文字列と比較してデータへのアクセスとナビゲーションを高速化します。バリアントバイナリエンコーディング形式の実装はオープンソース ライブラリにパッケージ化されており、他のプロジェクトでも使用できます。
- バリアントデータ型のサポートもDeltaに対してオープンソース化されており、プロトコルRFCはここで確認できます。バリアントサポートは、Spark 4.0およびDelta 4.0に含まれる予定です。
「私たちは、オープンソースのデータプラットフォームであるLegendを通じてデータに焦点を当て、オープンソースコミュニティを支援しています」と、ゴールドマン・サックスの最高データ責任者兼データエンジニアリング責任者であるニーマ・ラファエル氏は述べています。 「Sparkにおけるオープンソースバリアントの導入は、オープンデータエコシステムにとって大きな前進です」
DBR 15.3 以降では、前述のすべての機能がお客様にご利用いただけるようになります。
バリアントとは
バリアント型 (Variant) は、半構造化データを格納するための新しいデータ型です。 今後の Databricks Runtime 15.3 リリースのパブリック プレビューでは、JSON を介した階層データの入出力がサポートされます。 Variant がなければ、顧客は柔軟性とパフォーマンスのどちらかを選択する必要がありました。 柔軟性を維持するために、顧客は JSON を文字列として単一の列に保存します。 パフォーマンスを向上させるために、顧客は構造体を使用した厳密なスキーマ化アプローチを適用しますが、これにはスキーマの変更を維持および更新するための個別のプロセスが必要です。 Variant を使用すると、顧客は柔軟性を維持し (明示的なスキーマを定義する必要はありません)、JSON を文字列としてクエリする場合に比 べて大幅に向上したパフォーマンスを実現できます。
Variant は、JSON ソースに不明で変更され、頻繁に進化するスキーマがある場合に特に役立ちます。 たとえば、顧客はエンドポイント検出と対応 (EDR) のユースケースを共有しており、異なる JSON スキーマを含むログを読み取って結合する必要があります。 同様に、広告クリックやアプリケーションのテレメトリなど、スキーマが不明で常に変更される用途には、バリアント型が適しています。 どちらの場合も、バリアント型データ型の柔軟性により、明示的なスキーマを必要とせずにデータを取り込み、パフォーマンスを向上させることができます。
パフォーマンスベンチマーク
Variant は、JSON を文字列として維持する既存のワークロードよりもパフォーマンスが向上します。 顧客データからヒントを得たスキーマを使用して複数のベンチマークを実行し、文字列とバリアントのパフォーマンスを比較しました。 ネストされたスキーマとフラット スキーマの両方において、Variant を使用した場合のパフォーマンスは、文字列列に比べて 8 倍向上しました。 ベンチマークは、Photon が有効になっている Databricks Runtime 15.0 を使用して実施されました。
バリアントを使用するにはどうすればよいですか?
バリアント型をサポートするための新しい関数が多数あり、バリアントのスキーマを検査したり、バリアント列を展開したり、JSON に変換したりすることができます。 PARSE_JSON() 関数は、JSON 文字列入力を表すバリアント値を返すためによく使用されます。
バリアント型データを読み込むには、バリアント型でテーブル列を作成します。 PARSE_JSON() 関数を使用して、任意の JSON 形式の文字列を Variant に変換し、Variant 列に挿入できます。
CTAS を使用して、バリアント列を含むテーブルを作成できます。 作成されるテーブルのスキーマは、クエリ結果から派生します。 したがって、バリアント型 (Variant) 列を持つテーブルを作成するには、クエリ結果の出力スキーマにバリアント型 (Variant) 列が含まれている必要があります。
COPY INTO を使用して、JSON データを 1 つ以上の Variant 列を持つテーブルにコピーすることもできます。
パスナビゲーションは、直感的なドット表記の構文に従います。
完全にオープンソースで、独自のデータロックインはありません
おさらいしましょう。
- Variant データ型、バイナリ式、バイナリ エンコード形式は、Apache Spark にすでに統合されています。 バイナリ エンコード形式の詳細については 、こちらを参照してください。
- バイナリ エンコード形式を使用すると、文字列と比較して、データへのアクセスとナビゲーションが高速になります。 バイナリ エンコーディング形式の実装はオープンソース ライブラリにパッケージ化されているため、他のプロジェクトでも使用できます。
- Variant データ型のサポートも Delta にオープンソース化されており、プロトコルの RFC はここで確認できます。 バリアントのサポートは、Spark 4.0 および Delta 4.0 に含まれます。
さらに、バリアント型のシュレッダー/サブ列化を実装する予定です。 シュレッダーは、バリアント データ内の特定のパスをクエリするパフォーマンスを向上させる手法です。 シュレッドを使用すると、パスを独自の列に格納できるため、そのパスのクエリに必要な IO と計算を削減できます。 また、シュレッダー処理により、データのプルーニングが可能になり、不要な作業が増えるのを防ぐことができます。 シュレッディングは Apache Spark および Delta Lake でも利用可能になります。
今年の 6 月 10 日から 13 日までサンフランシスコで開催される DATA + AI サミットに参加されますか?
「バリアント型 - 半構造化データを高速かつシンプルにする」にご参加ください。
バリアントは、パブリック プレビューのDatabricks Runtime 15.3 およびその後すぐに DBSQL プレビュー チャンネルでデフォルトによって有効になります。 半構造化データの 使用事例をテストし、ご意見やご質問がある場合は、 Databricks コミュニティ フォーラムで会話を開始してください。 コミュニティのご意見をぜひお聞かせください。