變體與 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 | 爆炸 | 輸出 pos 、 key 和 value 資料行。 當爆炸陣列時,輸出索引鍵一律為 Null。 |
variant_explode_outer | explode_outer | 輸出 pos 、 key 和 value 資料行。 當爆炸陣列時,輸出索引鍵一律為 Null。 |
Variant 處理轉換的方式 NULL
與 JSON 字串不同。 請參閱 Variant 類型轉換規則 和 Variant Null 規則。