Hive 的字符串UrlDecode 中文解码



真没想到,原来HIVE自己有Urldecode,原本以为要写一个UDF,结果不然。

业务场景: 某字段基本为中文字符,采集时做了urlEncode处理,入到库中没有解码。



要解决的问题:将encode的数据做urldecode处理

方案一:自构建一个UDF函数,需要继承UDF,实现其evaluate()方法

@Description(name = "decoder_url", value = "_FUNC_(url [,code][,count]) - decoder a URL from a String for count times using code as encoding scheme ", extended = ""  
    + "if count is not given ,the url will be decoderd for 2 time,"  
    + "if code is not given ,GBK is used")  
public class UDFDecoderUrl extends UDF {  
  private String url = null;  
  private int times = 2;  
  private String code = "GBK";  
  
  public UDFDecoderUrl() {  
  }  
  
  public String evaluate(String urlStr, String srcCode, int count) {  
    if (urlStr == null) {  
      return null;  
    }  
    if (count <= 0) {  
      return urlStr;  
    }  
    if (srcCode != null) {  
      code = srcCode;  
    }  
    url = urlStr;  
    times = count;  
    for (int i = 0; i < times; i++) {  
      url = decoder(url, code);  
    }  
    return url;  
  }  
  
  public String evaluate(String urlStr, String srcCode) {  
    if (urlStr == null) {  
      return null;  
    }  
    url = urlStr;  
    code = srcCode;  
    return evaluate(url, code,times);  
  }  
  
  public String evaluate(String urlStr, int count) {  
    if (urlStr == null) {  
      return null;  
    }  
    if (count <= 0) {  
      return urlStr;  
    }  
    url = urlStr;  
    times = count;  
      
    return evaluate(url, code,times);  
  }  
  
  public String evaluate(String urlStr) {  
    if (urlStr == null) {  
      return null;  
    }  
    url = urlStr;  
    return evaluate(url, code,times);  
  }  
  
  private String decoder(String urlStr, String code) {  
    if (urlStr == null || code == null) {  
      return null;  
    }  
    try {  
      urlStr = URLDecoder.decode(urlStr, code);  
    } catch (Exception e) {  
      return null;  
    }  
    return urlStr;  
  }  
}  

打包上传应用的操作就不描述了

但是,还有更好的,直接应用

方案二

select reflect("java.net.URLDecoder", "decode", trim(字段名), "UTF-8")  from 库名.表名  limit 10;

得到的结果




两个方案 你选哪种呢?

参考
http://bigdatums.net/2016/11/13/how-to-decode-urls-in-hive/
http://grokbase.com/t/hive/user/119f4qdsmh/urldecode-hive-column



[本日志由 admin 于 2017-05-23 12:17 AM 更新]
上一篇: 2017.05.14. 2017凯乐石广州龙洞越野
下一篇: Hive应用sqoop从MS-SQL 和Oracle 全量增量导入至HIVE
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
相关日志:
评论: 0 | 引用: 0 | 查看次数: 11044
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 30 字 | UBB代码 关闭 | [img]标签 关闭