字符串映射转换配置单元

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串映射转换配置单元相关的知识,希望对你有一定的参考价值。

我有一个有四列的表。

C1    C2    C3    C4
--------------------
x1    y1    z1    d1
x2    y2    z2    d2

现在我想将它转换为具有键和值对的地图数据类型并加载到单独的表中。

create table test
(
   level map<string,string>
)
row format delimited
COLLECTION ITEMS TERMINATED BY '&'
map keys terminated by '=';

现在我在sql下面使用加载数据。

insert overwrite table test
select str_to_map(concat('level1=',c1,'&','level2=',c2,'&','level3=',c3,'&','level4=',c4) from input;

在表格上选择查询。

select * from test;
{"level1":"x1","level2":"y1","level3":"z1","level4":"d1=\"}
{"level1":"x2","level2":"y2","level3":"z2","level4":"d2=\"}

我没理解为什么我在最后一个值中得到额外的“= ”。

我仔细检查数据,但问题仍然存在。

你能帮忙吗?

答案

str_to_map(text, delimiter1, delimiter2) - 通过解析文本使用两个分隔符将文本拆分为键值对来创建映射。第一个分隔符分隔对,第二个分隔符分配键和值。如果只给出一个参数,则使用默认分隔符:','delimiter1'='delimiter2

您可以通过运行以下命令获取此信息:

describe function extended str_to_map

在您的语法中有两个错误:

insert overwrite table test
select str_to_map(concat('level1=',c1,'&','level2=',c2,'&','level3=',c3,'&','level4=',c4) from input;

首先是,缺少一个括号)。

第二,它基本上不是一个错误,你没有给定分隔符所以函数采用分隔符的默认值,这就是你的结果中得到','的原因。

要以当前格式获取输出,您应该尝试以下查询:

insert overwrite table test
select str_to_map(concat('level1=',c1,'&','level2=',c2,'&','level3=',c3,'&','level4=',c4),'&','=') from input;

以上是关于字符串映射转换配置单元的主要内容,如果未能解决你的问题,请参考以下文章

单元测试 NPE,当我添加片段自定义转换时

nginx.conf 忽略了 nginx-ingress 配置映射片段

如何在配置单元中将字符串转换为数组?

如何将字符串转换为配置单元中的结构数组并爆炸?

如何在配置单元中将字符串数据类型列转换为日期格式

Huawei_Netconf_Ncclient