UDF函数 解码url
背景
URL 的编码 是ASCII十六进制格式。数仓接受到前端上报的URL,要对URL字段解码。
如要将
https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2"Fmybook.do%3Frequest_type%3D%26type%3Dprivate
解码为:
https://mywebsite/docs/english/site/mybook.do?request_type=&type=private
方式
hive sql中,通过反射调用java.net.URLDecoder方法
select reflect('java.net.URLDecoder', 'decode',url, 'UTF-8') from table_name;
问题
实践中发现,部分https开头的url解析不完整。例如解码下面的URL,
https%253A%252F%252Fwww.cnblogs.com/drjava
通过上面的方法,结果是:
https%3A%2F%2Fwww.cnblogs.com/drjava
解决方案
通过google找到了可行的方法,解码两次,由于sql写起来比较难以阅读,所以封装了udf。代码如下:
import org.apache.hadoop.hive.ql.exec.UDF;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder; public class UrlDecode extends UDF {
/**
*
*
* @param component 编码的url
* @return 解码url
*/
public String evaluate(String component) {
if(component == null || component.length() <= 0){
return "";
} String result = "";
component = component.replaceAll("%(?![0-9a-fA-F]{2})", "%25");
try {
result = URLDecoder.decode(component, "UTF-8");
result = URLDecoder.decode(result, "UTF-8");
} catch (UnsupportedEncodingException e) {
result = component;
}
return result;
}
}
做一下单元测试
import org.junit.Assert;
import org.junit.Test;
import udf.UrlDecode; public class UrlDecodeTest {
@Test
public void UrlDecodeMethod(){
UrlDecode ud = new UrlDecode();
Assert.assertEquals(ud.evaluate("https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2" +
"Fmybook.do%3Frequest_type%3D%26type%3Dprivate"),
"https://mywebsite/docs/english/site/mybook.do?request_type=&type=private"); Assert.assertEquals(ud.evaluate("你是谁,为了谁"),"你是谁,为了谁"); Assert.assertEquals(ud.evaluate(null),"");
}
}
UDF函数 解码url的更多相关文章
- 自定义UDF函数应用异常
自定义UDF函数应用异常 版权声明:本文为yunshuxueyuan原创文章.如需转载请标明出处: http://www.cnblogs.com/sxt-zkys/QQ技术交流群:299142667 ...
- hive UDF函数
虽然Hive提供了很多函数,但是有些还是难以满足我们的需求.因此Hive提供了自定义函数开发 自定义函数包括三种UDF.UADF.UDTF UDF(User-Defined-Function) ...
- 各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)
原文:各种加密解密函数(URL加密解密.sha1加密解密.des加密解密) 普通hash函数如md5.sha1.base64等都是不可逆函数.虽然我们利用php可以利用这些函数写出可逆函数来.但是跨语 ...
- 【Spark篇】---SparkSql之UDF函数和UDAF函数
一.前述 SparkSql中自定义函数包括UDF和UDAF UDF:一进一出 UDAF:多进一出 (联想Sum函数) 二.UDF函数 UDF:用户自定义函数,user defined functio ...
- Spark注册UDF函数,用于DataFrame DSL or SQL
import org.apache.spark.sql.SparkSession import org.apache.spark.sql.functions._ object Test2 { def ...
- hive 中简单的udf函数编写
.注册函数,使用using jar方式在hdfs上引用udf库. $hive.注销函数,只需要删除mysql的hive数据记录即可. delete from func_ru ; delete from ...
- pyspark 编写 UDF函数
pyspark 编写 UDF函数 前言 以前用的是Scala,最近有个东西要用Python,就查了一下如何编写pyspark的UDF. pyspark udf 也是先定义一个函数,例如: def ge ...
- 如何编写自定义hive UDF函数
Hive可以允许用户编写自己定义的函数UDF,来在查询中使用.Hive中有3种UDF: UDF:操作单个数据行,产生单个数据行: UDAF:操作多个数据行,产生一个数据行. UDTF:操作一个数据行, ...
- 自定义PHP页面跳转函数redirect($url, $time = 0, $msg = '')
利用PHP的header()函数,可以实现页面跳转,如 header("Location: " . $url); 但它有个缺点,一旦HTTP报头块已经发送,就不能使用 header ...
随机推荐
- yii2 模板twig中使用GridView::widget
yii框架twig模板中使用GridView::widget 需要这样写: {{ grid_view_widget({ 'dataProvider': provider, 'columns': [ ' ...
- nltk分词
1.安装nltk 2.运行如下 >>>import nltk>>> nltk.download('punkt') 3.代码: import nltk sentenc ...
- windows下的mongodb安装与配置
一.下载mongodb安装文件 https://www.mongodb.com/download-center/community 选择zip压缩包方式,如:mongodb-win32-x86_64- ...
- flask debug 模式开启
debug 模式开启 最近在写python flask 的Waf后台管理界面,想要启用调试模式,发现安装目前网上流行的两种方式均无法在我的Pycharm中打开调试模式. )直接在对象上设置 app.d ...
- Scrapy Spider MiddleWare 设置
# -*- coding: utf-8 -*- # Define here the models for your spider middleware # # See documentation in ...
- ElasticSearch聚合(转)
ES之五:ElasticSearch聚合 前言 说完了ES的索引与检索,接着再介绍一个ES高级功能API – 聚合(Aggregations),聚合功能为ES注入了统计分析的血统,使用户在面对大数据提 ...
- python AES加密 ECB PKCS5
class AesEbc16: # 按块的大小, 一块一块的加密, 明文和密文长度一样 def __init__(self): self.key = b"123qweqqqwerqwer& ...
- echart 图例
说明:stack相同,两个bar合并但是不会重叠 如果需要重叠 用barGap: '-100%', 根据不同的需求来使用两者. <template> <div> echart ...
- insmod 签名问题
问题现象: 通过 insmod 加载 XXX.ko 时候提示: hello: module verification failed: signature and/or required key mis ...
- 列出cron的下几次运行时间
static void Main(string[] args) { while(true) { var corn = Console.ReadLine(); var s=getCronSchdule( ...