Argument type mismatch ‘map’: The first and seconds arguments of function NLV should have the same type, but they are different: “map<string,int>” and “map<string,string>”
一、报错解决
当使用hive执行一段sql的时候,出现了这样一段报错,查看了详细的代码,定位到了错误的代码行
,nvl(l6.label,map())
,nvl(l7.label,map())
,nvl(l13.label,map())
,nvl(l16.label,map())
,nvl(l19.label,map())
,nvl(l20.label,map())
,nvl(l21.label,map())
,nvl(l32.label,map())
,nvl(l33.label,map())
,nvl(l34.label,map())
,nvl(l35.label,map())
,nvl(l36.label,map())
,nvl(l37.label,map())
在进行一连串的标签定义的时候出现了这个错误
报错信息
Argument type mismatch 'map': The first and seconds arguments of function NLV should have the same type, but they are different: "map<string,int>" and "map<string,string>"
这个报错大概意思是在map类型不一样,NLV的两个参数应该是一样的类型
检查了数据类型之后,发现确实,第一个参数类型是map<string,int>,第二个参数类型是map<string,string>,所以这个在使用nvl的时候需要两个参数的map类型是一致的。
二、NVL的使用
那么看一下nvl怎么使用
查看一下NVL的使用
desc function nvl;
意思就是当value为null的时候返回default_value,当不为null的时候返回value
1. 基本数据类型的时候
select nvl("string",1);
select nvl(1.0,"string");
当基本数据类型不一致的时候是否可以
可以看到基本数据类型是没有问题的
2. map()类型
那么map类型是否可以
select nvl(map("string","string"), map(1,1));
select nvl(map("string",1), map());
select nvl(map("string","string"), map());
可以看出来,map类型如果前后不一样的类型是不可以的