字符串到Map转换配置单元

pqwbnv8z  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(367)

我有一张有四列的table。

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

现在我想把它转换成具有键和值对的Map数据类型,并加载到单独的表中。

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=\\"}

我不明白为什么我得到额外的“=\”在最后的价值。
我仔细检查了数据,但问题仍然存在。
你能帮忙吗?

dtcbnfnu

dtcbnfnu1#

str_to_map(text, delimiter1, delimiter2) -通过使用两个分隔符将文本拆分为键值对来分析文本,从而创建Map。第一个分隔符分隔成对,第二个分隔符分隔键和值。如果只给定一个参数,则使用默认分隔符: ',' 作为 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;

相关问题