次の方法で共有


バリアントと JSON 文字列の違い

重要

この機能はパブリック プレビュー段階にあります。

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

Databricks Runtime 15.3 以降では、バリアント データ型を使用して、半構造化データのエンコードとクエリを実行できます。 Databricks では、半構造化データの格納に JSON 文字列を使用する代わりにバリアントを使用することをお勧めします。 バリアントの読み取りと書き込みのパフォーマンスが向上するため、一部のユース ケースでは、構造体や配列などのネイティブ 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 文字列関数、動作の違いに関するメモを示します。

Note

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

バリアント関数 JSON 文字列関数 メモ
variant_get cast および get_json_object 式、パス、および型を受け取ります。 バリアント パス、キャスト、および null のすべてのルールに従います。
try_variant_get try_cast および get_json_object 式、パス、および型を受け取ります。 バリアント パス、キャスト、および null のすべてのルールに従います。
is_variant_null is null 式が VARIANT エンコードされた NULL を保存しているかどうかを確認します。 is null を使用して、入力式が NULL かどうかを確認します。
schema_of_variant schema_of_json ARRAY<elementType> のスキーマを決定するときに、データに競合する型が見つかった場合、elementTypeVARIANT として推論される可能性があります。
schema_of_variant_agg schema_of_json_agg 最も一般的でない型が識別されない場合、型は VARIANT として派生します。
variant_explode explode poskey、および value 列を出力します。 配列を分解する場合、出力キーは常に null になります。
variant_explode_outer explode_outer poskey、および value 列を出力します。 配列を分解する場合、出力キーは常に null になります。

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