当前位置: 首页 > news >正文

丽江建设局网站seo百度关键词排名

丽江建设局网站,seo百度关键词排名,【转】网页 网站 html如何实现"关闭窗口"代码大全,哈尔滨网站排名公司使用Java编写Hive的UDF实现身份证号码校验及15位升级18位 背景 在数仓项目中,有时候会根据身份证信息做一些取数filter或者条件判断的相关运算进而获取到所需的信息。古人是用Oracle做数仓,理所当然是用SQL写UDF【虽然SQL写UDF给SQL用就像用鸡肉饲养肉…

使用Java编写Hive的UDF实现身份证号码校验及15位升级18位

背景

在数仓项目中,有时候会根据身份证信息做一些取数filter或者条件判断的相关运算进而获取到所需的信息。古人是用Oracle做数仓,理所当然是用SQL写UDF【虽然SQL写UDF给SQL用就像用鸡肉饲养肉鸡一样,令笔者感叹Oracle的神奇】。自从Oracle数据库开发岗位被取缔后,SQL Boy们就摇身一变,成为还是只会写Hive SQL脚本的大数据开发攻城狮。本来SQL Boy们力推“原则上不允许写Java和Scala,只允许写SQL”,但是纯SQL的方式写出来,case when里套case when,套了好几层,还没有写完,就已经有几百行了。由于HQL任务可能多次用到这个功能,会导致凡是用到这种判断算法的HQL脚本最终能有几千行、上w行,不忍直视。所以最迂腐的SQL Boy也终于还是想明白了原则上不允许代表着实际上可以这么做。笔者就写了这个UDF来大幅减少HQL任务的篇幅,提升美观性。日后更多的SQL Boy也可以直接套用这个方法提高开发效率。

原理

参考:https://lizhiyong.blog.csdn.net/article/details/126186377

众所周知,Hive不可以像Oracle那样用SQL写UDF,所以需要Java写,并且打Jar包注册运行。底层原理参照之前的这篇。简单起见,就不继承GenericUDF了,而是继承UDF。

具体的规则,需要参考国标:GB11643-1999。老的 GB11643-1989 已经淘汰了,这也是为神马要有15位升级18位的功能。国标中已经给出了具体的系数和校验位的算法,照猫画虎即可。

算法

先去除脏数据,如果满足15位长,就升级18位。如果是18位,就算出校验码判断是否和数据的校验码一致。为了让判断更严谨,当然还需要添加一些判断,例如上上世纪【1900年之前】出生的人一定不会用自己的身份证号买车了。。。这些都是业务代码,日后可以根据实际情况再做修正,比纯SQL方式的可维护性好太多了。

Java实现

pom

<properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><hive-exec.version>3.1.2</hive-exec.version><encoding>UTF-8</encoding></properties><dependencies><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>${hive-exec.version}</version><exclusions><exclusion><groupId>org.glassfish</groupId><artifactId>javax.el</artifactId></exclusion></exclusions></dependency></dependencies>

只需要这个 hive-exec 依赖即可。笔者当前版本的Apache Hive有依赖冲突,故手动排除了glassfish。

Java类

package com.zhiyong;import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;import java.text.SimpleDateFormat;
import java.util.Date;/*** @program: zhiyong_study* @description: HiveUDF用于检测是否为身份证号* @author: zhiyong* @create: 2023-02-23 21:27**/
public class IdCardCheck {//顺便用main方法做单元测试public static void main(String[] args) {String input1 = "142222190001011111";String input2 = "abCd1900ya101111x";String input3 = "#s12311111   11";String input4 = "###############";String input5 = "########### @";String input6 = "111112222233333";String input7 = "110 10  03x";String input8 = "11 946 9120 3";String input9 = "11 21951 2311 X";Udf_zhiyong_id_check udf_zhiyong_id_check = new Udf_zhiyong_id_check();System.out.println("result1 = " + udf_zhiyong_id_check.evauate(input1));System.out.println("result2 = " + udf_zhiyong_id_check.evauate(input2));System.out.println("result3 = " + udf_zhiyong_id_check.evauate(input3));System.out.println("result4 = " + udf_zhiyong_id_check.evauate(input4));System.out.println("result5 = " + udf_zhiyong_id_check.evauate(input5));System.out.println("result6 = " + udf_zhiyong_id_check.evauate(input6));System.out.println("result7 = " + udf_zhiyong_id_check.evauate(input7));System.out.println("result8 = " + udf_zhiyong_id_check.evauate(input8));System.out.println("result9 = " + udf_zhiyong_id_check.evauate(input9));}
}/*** UDF用于判断是否为身份证号码,18位则返回,15位则升级18位,否则返回空串*/
class Udf_zhiyong_id_check extends UDF {public String evauate(String input) {String result = "";if (StringUtils.isEmpty(input)) {return "";}result = input.replaceAll("x", "X")    //x->X.replaceAll("([a-z]+)", "")  //去除a-z.replaceAll("([A-W]+)", "")  //去除A-W.replaceAll("([Y-Z]+)", "")  //去除Y-Z.replaceAll("\\s*", "")  //去除所有空格;int length = result.length();if (!(15 == length || 18 == length)) {//必须是15位或者18位return "";}for (int i = 0; i < length; i++) {try {int parseInt = Integer.parseInt(String.valueOf(result.charAt(i)));} catch (NumberFormatException e) {if (!(i == 17 && String.valueOf(result.charAt(i)).equals("X"))) {return "";}}}//+一些判断让UDF更严谨//=====================================START================================Boolean flg = false;int[] provinceCode = {11, 12, 13, 14, 15,   //华北21, 22, 23,   //东北31, 32, 33, 34, 35, 36, 37,   //华东41, 42, 43,   //华中44, 45, 46,    //华南50, 51, 52, 53, 54, //西南61, 62, 63, 64, 65, //西北81, 82, 83    //港澳台};for (int i = 0; i < provinceCode.length; i++) {if (provinceCode[i] == Integer.parseInt(result.substring(0, 2))) {flg = true;}}if (!flg) {return "";}int year = 0;int month = 0;int day = 0;if (15 == length) {year = 1900 + Integer.parseInt(result.substring(6, 8));month = Integer.parseInt(result.substring(8, 10));day = Integer.parseInt(result.substring(10, 12));} else {year = Integer.parseInt(result.substring(6, 10));month = Integer.parseInt(result.substring(10, 12));day = Integer.parseInt(result.substring(12, 14));}if (year * 1000 + month * 100 + day >Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()))|| year < 1900) {return "";}if (month > 12 || month < 1) {return "";}if (day > 31 || day < 1) {return "";}if (day == 31 && (month == 4 || month == 6 || month == 9 || month == 11)) {return "";}if (month == 2 && day > 28) {if (day > 29) {return "";}//29号只存在于闰年if (!(year % 100 == 0 || (year % 4 == 0 && year % 100 != 0))) {return "";}}//==============================END============================int[] tmp1 = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; //存储系数String[] tmp2 = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};  //存储尾数int sum = 0;if (15 == length) {//身份证15位->18位String str_17 = result.substring(0, 6) + "19" + result.substring(6, 15);for (int i = 0; i < str_17.length(); i++) {//逐位相乘及sumsum += Integer.parseInt(String.valueOf(str_17.charAt(i))) * tmp1[i];}for (int i = 0; i < tmp2.length; i++) {if (i == sum % 11) {return str_17 + tmp2[i];}}}//18位的需要校验尾数for (int i = 0; i < length - 1; i++) {sum += Integer.parseInt(String.valueOf(result.charAt(i))) * tmp1[i];}for (int i = 0; i < tmp2.length; i++) {if (i == sum % 11) {if (!(tmp2[i].equals(String.valueOf(result.charAt(17))))) {return "";}}}return result;}}

大数据行业,业务算法不值钱,值钱的是数据。。。笔者把sit验证用的数据脱敏了。。。读者可以自己搞一些验证。

结果

在这里插入图片描述

当使用正确的数据时,可以返回值。如果有多余的空格,也可以去除掉并且返回正确的值。如果是错误的数据,就返回空串。

打Jar包上传DataPhin和上传到Apache Hive操作略有不同,底层实现是一致的,如果是别的平台也是类似的做法,要触类旁通!!!

总结

大数据开发中,如果处理的是结构化的表,用功能极其简陋的SQL并没有什么问题,反倒脚本短小易于阅读还有开发运维容易的优势。涉及到略微不那么简单的递归迭代、循环遍历、多路分支,纯SQL硬写也写得出来并且语法没问题的话也可以凑合着跑起来。但是遇到处理的是文件、流、或者每一条数据的字段个数不一样多的log,数据不再是结构化的表时,SQL就完全没有用武之地。虽然不如Scala那么强大,但是Java做这些事情还是比SQL强很多。原则是死的,人是活的,要与时俱进学会变通!!!

总结

大数据开发中,如果处理的是结构化的表,用功能极其简陋的SQL并没有什么问题,反倒脚本短小易于阅读还有开发运维容易的优势。涉及到略微不那么简单的递归迭代、循环遍历、多路分支,纯SQL硬写也写得出来并且语法没问题的话也可以凑合着跑起来。但是遇到处理的是文件、流、或者每一条数据的字段个数不一样多的log,数据不再是结构化的表时,SQL就完全没有用武之地。虽然不如Scala那么强大,但是Java做这些事情还是比SQL强很多。原则是死的,人是活的,要与时俱进学会变通!!!

转载请注明出处:https://lizhiyong.blog.csdn.net/article/details/129220107
在这里插入图片描述

http://www.yidumall.com/news/3181.html

相关文章:

  • 做一个多肉网站可以做哪些内容网站设计服务企业
  • 英文网站制作注意点优化推广
  • 上海债务优化公司肇庆百度快照优化
  • 做网站接活全流程设计网页的软件
  • 新网站seo方法珠海seo关键词排名
  • 360浏览器网站收藏代码google引擎入口
  • 华大网站建设做销售记住这十句口诀
  • isite企业建站系统网站收录软件
  • 自己做的网站视频播放不了百度一下你就知道
  • wordpress和帝国哪个好网站搜索排优化怎么做
  • 昆山网站建设官网百度seo网络营销书
  • 广告平面设计工作内容宁波seo网络推广定制
  • 廉江网站制作做网站公司哪家比较好
  • php做网站麻烦吗手机如何做网站
  • 贵州省建设执业资格教育促进会网站搜索引擎的营销方法有哪些
  • 新新手手网网站站建建设设新乡百度关键词优化外包
  • 煤矿建设工程质量监督总站网站国外直播平台tiktok
  • 个人养老金制度将落地seo查询网站是什么
  • 武汉网站建设不推广app怎么开发出来的
  • 昆明网站建设推荐网络营销推广方式
  • java程序员自己做网站乔拓云智能建站官网
  • 新网站建设方案ppt自己怎么做百度推广
  • 旅游网站建设推广南宁seo专员
  • 武汉建设学校学费多少杭州网站推广与优化
  • 尺寸在线做图网站网页制作作业100例
  • seo如何优化网站推广seo经理
  • 视频网站的做阿里网站seo
  • 外贸网站建设海外推广百度推广公司
  • 做网站的软件wd的叫啥谷歌seo快速排名软件首页
  • 山西省建设厅网站首页6十大技能培训机构排名