バリアントは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_NAME
とcolumn_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_explode
とvariant_explode_outer
PySpark ではサポートされていません。
バリアント関数 |
JSON文字列関数 |
注 |
---|---|---|
式、パス、および型を受け取ります。 バリアントのパス、キャスト、および null に関するすべての規則に従います。 |
||
式、パス、および型を受け取ります。 バリアントのパス、キャスト、および null に関するすべての規則に従います。 |
||
エクスプレッションに |
||
|
||
最小共通型が識別されない場合、型は |
||
|
||
|
バリアントは、キャストとNULL
を JSON 文字列とは異なる方法で処理します。 「バリアント型キャスト規則」および「バリアント型 null 規則」を参照してください。