UDFJson反斜杠解析出错记录

这个类在org.apache.hadoop.hive.ql.udf包 下,使用org.codehaus.jackson三方库解析Json字符串。

具体在Hive udf中的名字叫get_json_object。

 

当json字符串中有反斜杠"\"时,解析会出错

如:

{"title":"思科Q4收入估$79.2亿 前景阴云笼罩","ItemType":"NewsBase","keywords":"思科Q4收入估\$79.2亿 前景阴云笼罩","random":"1420253511075","callback":"BCore.instances[2].callbacks[1]","user_agent":"Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML; like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5","is_newgid":"false","uuid":"DS.Input:b56c782bcb75035d:00002116:003dcd40:54a75947","ptime":"1.1549997E9"}

get_json_object(attr,"$.title")会返回NULL,虽然title并不是null。这样就会造成一个混淆,当json字串中真的没有title属性时,方法也会返回null。

因此使用此udf查询结果会不正确。

源码:

有这样一段注释:

/**
* Extract json object from a json string based on json path specified, and
* return json string of the extracted json object. It will return null if the
* input json string is invalid.*/

同样代码实现上:

UDFJson.java#evaluate():

...

if (extractObject == null) {
try {
extractObject = MAPPER.readValue(jsonString, MAP_TYPE);
} catch (Exception e) {
return null;
}
extractObjectCache.put(jsonString, extractObject);
}

...

前面提到,UDFJson解析字串是用的jackson,

在MAPPER.readValue(jsonString, MAP_TYPE);中遇到非法字符时'\'会在catch块里return null

解决办法:

在代码里加上这一句:

static  {
     // Allows for unescaped ASCII control characters in JSON values
     JSON_FACTORY.enable(Feature.ALLOW_UNQUOTED_CONTROL_CHARS);
  // Enabled to accept quoting of all character backslash qooting mechanism
     JSON_FACTORY.enable(Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER);
   }
//使反斜杠为合法字符

你可能感兴趣的:(hive)