バリアントはJSON 文字列と何が異なるか

プレビュー

この機能はパブリックプレビュー段階です。

この記事では、バリアント型 (Variant) を使用する際の動作の変更と構文とセマンティクスの違いについて説明します。 この記事では、Databricks で JSON 文字列データの操作に精通していることを前提としています。 Databricks を初めて使用するユーザーの場合、変更や不明なスキーマに対する柔軟性が必要な半構造化データを保存するときは常に、JSON 文字列ではなくバリアントを使用する必要があります。 「半構造化データのモデル化」を参照してください。

Databricks Runtime 15.3 以降では、バリアント データ型を使用して半構造化データをエンコードおよびクエリできます。 Databricks では、JSON 文字列を使用して半構造化データを保存する代わりに、variant を推奨しています。 バリアントの読み取りおよび書き込みパフォーマンスが向上したため、一部のユースケースでは構造体や配列などのネイティブ Spark 複合型を置き換えることができます。

バリアント データのクエリーはどのように行うか

バリアント データでは、同じ演算子を使用して、フィールド、サブフィールド、および配列要素をクエリします。

フィールドを検索するには、 : を使用します。 たとえば、 column_name:field_nameです。

サブフィールドを照会するには、 . を使用します。 たとえば、 column_name:field_name.subfield_nameです。

配列要素を照会するには、 [n] を使用します ( n は要素の整数インデックス値です)。 たとえば、配列の最初の値を照会するには、 column_name:array_name[0]します。

JSON 文字列からバリアントにアップグレードすると、次の違いにより既存のクエリが機能しなくなる可能性があります。

  • すべてのバリアント パス要素は、大文字と小文字を区別する方法で照合されます。 JSON 文字列では大文字と小文字は区別されません。 つまり、バリアントの場合、 column_name:FIELD_NAMEcolumn_name:field_name は、保存されたデータで異なるフィールドを探します。

  • [*]構文は、配列内のすべての要素を識別またはアンパックするためのサポートではありません。

  • バリアントは、JSON 文字列とは異なる方法でNULL値をエンコードします。 バリアント null ルールを参照してください。

  • バリアント列には、一部の操作で制限があります。 制限事項を参照してください。

JSON文字列をバリアントに変換する

Databricks Runtime 15.3 以降では、 to_json関数にVARIANT型を JSON 文字列にキャストする追加機能があります。 VARIANTを JSON 文字列に変換する場合、オプションは無視されます。 to_jsonを参照してください。

parse_json関数は JSON 文字列をVARIANT型に変換します。 parse_json(json_string_column)to_json(variant_column)の論理的な逆数ですが、次の変換規則は、それが完全な逆数ではない理由を示しています。

  • 空白は完全には保持されません。

  • キーの順序は任意です。

  • 数値の末尾のゼロは切り捨てられる場合があります。

JSON 文字列が不正な形式であるか、バリアントのサイズ制限を超えている場合、 parse_json関数はエラーを返します。 代わりに try_parse_json 関数を使用して、解析でエラーが発生したときに NULL を返します。

バリアントを操作するための SQL 関数は何か

Databricks Runtime 15.3 以降で使用可能な Apache Spark SQL 関数は、バリアント データと対話するためのメソッドを提供します。 次の表には、新しい関数、対応する JSON 文字列関数、および動作の違いに関する注意事項が記載されています。

注:

これらの関数を PySpark DataFrames で使用するには、 pyspark.sql.functionsからインポートします。 variant_explodevariant_explode_outer PySpark ではサポートされていません。

バリアント関数

JSON文字列関数

variant_get

キャストget_json_object

式、パス、および型を受け取ります。 バリアントのパス、キャスト、および null に関するすべての規則に従います。

try_variant_get

try_castget_json_object

式、パス、および型を受け取ります。 バリアントのパス、キャスト、および null に関するすべての規則に従います。

is_variant_null

ヌルです

エクスプレッションに VARIANT エンコードされた NULLが格納されているかどうかを確認します。 is null を使用して、入力式がNULLかどうかを確認します。

schema_of_variant

schema_of_json

ARRAY<elementType>のスキーマを決定するときに、データに競合する型が見つかったかどうかVARIANTelementTypeが推測される場合があります。

schema_of_variant_agg

schema_of_json_agg

最小共通型が識別されない場合、型は VARIANTとして派生します。

variant_explode

爆発する

pos列、key列、value列を出力します。配列を分解する場合、出力キーは常に null です。

variant_explode_outer

explode_outer

pos列、key列、value列を出力します。配列を分解する場合、出力キーは常に null です。

バリアントは、キャストとNULLを JSON 文字列とは異なる方法で処理します。 「バリアント型キャスト規則」および「バリアント型 null 規則」を参照してください。