我有一个有四列的表。
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=\\"}
我没理解为什么我在最后一个值中得到额外的“= \ \”。
我仔细检查数据,但问题仍然存在。
你能帮忙吗?
答案 0 :(得分:6)
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;