variant は JSON 文字列とどう違うのですか?
プレビュー
この機能は パブリック プレビュー段階です。
この記事では、バリアント データ型を操作する際の動作の変更と、構文とセマンティクスの違いについて説明します。 この記事は、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)
の論理逆数ですが、次の変換ルールは、それが正確な逆数ではない理由を説明しています。
- 空白は完全には保持されません。
- キーの順序は任意です。
- 数値の末尾の 0 は切り捨てられる場合があります。
parse_json
関数は、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 ルールを参照してください。