我正在嘗試將一個宣告列具有某種struct型別(例如struct<x: string, y: string>)的資料集轉換為一種map<string, string>型別。我想用 SQL 來做,可能不使用 UDF。
更新:
我的要求還在于轉換是在沒有任何結構鍵先驗知識的情況下完成的(在我的問題中,我在復雜的 JSON 中獲取資料,我不想在模式中保持這種復雜性)。
示例輸入資料:
WITH input (struct_col) as (
select named_struct('x', 'valX', 'y', 'valY') union all
select named_struct('x', 'valX1', 'y', 'valY2')
)
select *
from input
預期輸出是一個型別的列 map<string, string>
| struct_col:map<字串,字串> |
|---|
| {"x":"valX","y":"valY"} |
| {"x":"valX1","y":"valY2"} |
更新:
到目前為止,我設法找到了這個非常復雜的解決方案,它只適用于 Spark >= 3.1.0(因為json_object_keys功能)。能夠將結構轉換為地圖真是太好了
WITH input (struct_col) as (
select named_struct('x', 'valX', 'y', 'valY') union all
select named_struct('x', 'valX1', 'y', 'valY2')
)
select transform_values(
map_from_arrays(
json_object_keys(to_json(struct_col)),
json_object_keys(to_json(struct_col))
),
(k, v) -> get_json_object(to_json(struct_col), '$.' || k))
from input
uj5u.com熱心網友回復:
我找到了一種方法,它需要使用to_json和from_json函式進行一次序列化和決議 json 的往返。訣竅是from_json在我使用該map<string, string>型別的地方也采用模式引數。
此外,此解決方案應該適用于 spark < 3.x
WITH input (struct_col) as (
select named_struct('x', 'valX', 'y', 'valY')
union all
select named_struct('x', 'valX1', 'y', 'valY2')
)
select from_json(to_json(struct_col), 'map<string, string>') as map_col
from input;
uj5u.com熱心網友回復:
關于什么
create_map('struct_col.x', 'struct_col.valX', 'struct_col.y', 'struct_col.valY')
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/387876.html
