我正在尝试转换一个数据集,该数据集声明一列具有特定的struct
类型(例如struct<x: string, y: string>
) to a map<string, string>
类型。我想用 SQL 来完成,可能不使用 UDF。
UPDATE:
我的要求还在于,转换通常是在没有任何结构键先验知识的情况下完成的(在我的问题中,我以复杂的 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<string, string> |
{"x":"valX","y":"valY"} |
{"x":"valX1","y":"valY2"} |
UPDATE:
到目前为止,我设法找到了这个非常复杂的解决方案,它仅适用于 Spark >=3.1.0
(因为json_object_keys https://spark.apache.org/docs/3.1.2/api/sql/index.html#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