在 Spark SQL 中将结构转换为映射

2024-04-22

我正在尝试转换一个数据集,该数据集声明一列具有特定的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

我找到了一种方法来做到这一点,需要使用以下命令来一次序列化和解析 jsonto_json https://spark.apache.org/docs/latest/api/sql/index.html#to_json and from_json https://spark.apache.org/docs/latest/api/sql/index.html#from_json功能。诀窍是from_json还需要一个模式参数,我在其中使用map<string, string> type.

此外,此解决方案应该适用于 Spark

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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Spark SQL 中将结构转换为映射 的相关文章

随机推荐