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

四川建设行业数据共享平台的网站彩视网站建设策划

四川建设行业数据共享平台的网站,彩视网站建设策划,企业中征码查询入口,国内重大新闻事件2021简短使用Java编写Hive的UDF实现身份证号码校验及15位升级18位 背景 在数仓项目中#xff0c;有时候会根据身份证信息做一些取数filter或者条件判断的相关运算进而获取到所需的信息。古人是用Oracle做数仓#xff0c;理所当然是用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 propertiesmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.targethive-exec.version3.1.2/hive-exec.versionencodingUTF-8/encoding/propertiesdependenciesdependencygroupIdorg.apache.hive/groupIdartifactIdhive-exec/artifactIdversion${hive-exec.version}/versionexclusionsexclusiongroupIdorg.glassfish/groupIdartifactIdjavax.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更严谨//STARTBoolean 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 ;}}//ENDint[] 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.ho-use.cn/article/10823918.html

相关文章:

  • 网站如何防止别人抄袭wordpress 语言插件
  • 网站的流程图南通旅游网站建设
  • 关于网站建设的pptwordpress商家展示主题
  • 网站建设方案合同考幼师证去哪个网站做试题
  • 网站开发工程师特点广告公司岗位
  • 网站二级目录做优化百度指数是什么
  • 中小型网站建设多少钱糟糕的网站设计
  • PHP做的哪些大型网站广州网络公司
  • 昆明网站建设推广公司哪家好ae在线生成视频
  • 企业站模板大全郑州网络营销公司排名
  • 设计比较好的企业网站网站建设任职资格
  • 网站改版做301是啥意思 换域名孝感注册公司
  • 合肥网站建设讯息同一个ip网站太多 seo
  • 东莞网站如何制作中国企业网银怎么登录
  • 辽宁城乡建设厅网站学做古典家具网站
  • 用仿站工具做网站电话号码查询企业
  • 想在微信公众号上做网站链接上海网址一360导航
  • 什么是网站策划书如何搭建个人博客网站
  • 网站如何绑定域名江西企业网站建设电话
  • 基础网站建设代码如何建立学校网站
  • 企业网站建设维护合同书wordpress fifth
  • 宠物用品网站建设自己做的网站怎么放到外网上
  • 金属东莞网站建设技术支持品牌建设指导性意见
  • 网站设计改版深圳猪八戒网站建设
  • 长春网站建设方案详细wordpress什么主题好
  • 深圳极速网站建设服务上海市住房与城乡建设部网站
  • 南昌专业做网站公司网站建设吧个好
  • 怎么免费开网站建设工程检测网
  • 苏州住房和城乡建设局网站如何在网站上添加备案号
  • 什么网站做一手房比较好秦皇岛最新消息今天