【发布时间】:2022-01-19 14:45:30
【问题描述】:
我正在尝试将一个声明一列以具有特定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<string, string> |
|---|
| {"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
【问题讨论】:
标签: apache-spark apache-spark-sql