共用方式為


變體與 JSON 字串有什麼不同?

重要

這項功能處於公開預覽狀態

本文說明使用 Variant 數據類型時,語法和語意的行為變更和差異。 本文假設您已熟悉在 Azure Databricks 上使用 JSON 字串數據。 對於不熟悉 Azure Databricks 的使用者,每當儲存需要變更或未知架構彈性的半結構化數據時,您應該使用 JSON 字串的變體。 請參閱 模型半結構化數據

在 Databricks Runtime 15.3 和更新版本中,您可以使用 Variant 數據類型來編碼和查詢半結構化數據。 Databricks 建議 Variant 作為使用 JSON 字串儲存半結構化數據的替代專案。 Variant的改善讀取和寫入效能可讓它取代原生 Spark 複雜類型,例如結構與陣列在某些使用案例中。

如何查詢變體數據?

Variant 數據會使用相同的運算元來查詢欄位、子欄位和陣列元素。

若要查詢欄位,請使用 :。 例如: column_name:field_name

若要查詢子欄位,請使用 .。 例如: column_name:field_name.subfield_name

若要查詢陣列元素,請使用 [n] where n 是專案的整數索引值。 例如,若要查詢陣列中的第一個值, column_name:array_name[0]

從 JSON 字串升級為 variant 時,下列差異可能會中斷現有的查詢:

  • 所有變體路徑元素都會以區分大小寫的方式比對。 JSON 字串不區分大小寫。 這表示針對 variant, column_name:FIELD_NAME 並在 column_name:field_name 預存資料中尋找不同的欄位。
  • 語法 [*] 不支持識別或解除封裝數位中的所有專案。
  • Variant 會 NULL 以不同於 JSON 字串的方式編碼值。 請參閱 Variant Null 規則
  • Variant 列對於某些操作有限制。 請參閱 限制

將 JSON 字串轉換至 variant 和 From variant

在 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 DataFrame 使用這些函式,請從 匯入 pyspark.sql.functions它們。 variant_explode PySpark 不支援 和 variant_explode_outer

Variant 函式 JSON 字串函式 備註
variant_get 轉換get_json_object 採用表達式、路徑和類型。 遵循變體路徑、轉型和 Null 的所有規則。
try_variant_get try_cast和get_json_object 採用表達式、路徑和類型。 遵循變體路徑、轉型和 Null 的所有規則。
is_variant_null 為 NULL 檢查表示式是否儲存 VARIANT 編碼 NULL的 。 用來 is null 檢查輸入表示式是否為 NULL
schema_of_variant schema_of_json 判斷的 ARRAY<elementType>架構時, elementType 可能會推斷 ,就像在數據中找到衝突的類型一樣 VARIANT
schema_of_variant_agg schema_of_json_agg 未識別出最不常見的型別時,型別會衍生為 VARIANT
variant_explode 爆炸 輸出 poskeyvalue 資料行。 當爆炸陣列時,輸出索引鍵一律為 Null。
variant_explode_outer explode_outer 輸出 poskeyvalue 資料行。 當爆炸陣列時,輸出索引鍵一律為 Null。

Variant 處理轉換的方式 NULL與 JSON 字串不同。 請參閱 Variant 類型轉換規則Variant Null 規則