メインコンテンツまでスキップ

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_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)の論理逆数ですが、次の変換ルールは、それが正確な逆数ではない理由を説明しています。

  • 空白は完全には保持されません。
  • キーの順序は任意です。
  • 数値の末尾の 0 は切り捨てられる場合があります。

parse_json 関数は、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> のスキーマを決定する際、データに矛盾するタイプが見つかった場合、elementTypeVARIANT と推測されることがあります。

schema_of_variant_agg

schema_of_json_agg

最小公認型が特定されない場合、その型は VARIANTとして派生します。

バリアント_エクスプロードです

爆発する

poskey、およびvalue列を出力します。配列を分解する場合、出力キーは常に null です。

variant_explode_outer

explode_outer

poskey、およびvalue列を出力します。配列を分解する場合、出力キーは常に null です。

バリアントは、キャストと NULLを JSON 文字列とは異なる方法で処理します。 バリアント型キャスト・ルールバリアント null ルールを参照してください。