大数据离线数仓的分析,必不可少的就是根据业务需求去解析字段,工作需要定义了解析ip的udf,希望可以给大家一些启发
- 创建maven工程,添加依赖 我这边用到的 一个是hive 一个ipip的依赖 pom文件如下 由于集群环境有hive,所以打包时不带进去,用provided方式实现
<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>3.1.0-mrs-2.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>net.ipip</groupId> <artifactId>ipdb</artifactId> <version>1.1.3</version> </dependency>
由于需要去华为云下载sdk 添加
<repositories> <repository> <id>huaweicloudsdk</id> <url>https://mirrors.huaweicloud.com/repository/maven/huaweicloudsdk/</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> <repository> <id>central</id> <name>Mavn Centreal</name> <url>https://repo1.maven.org/maven2/</url> </repository> </repositories>
以及打包插件
<plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.6</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
- 创建一个类 继承UDF 然后重写evaluate 方法
package com.vision.udf; import net.ipip.ipdb.City; import net.ipip.ipdb.IPFormatException; import org.apache.hadoop.hive.ql.exec.UDF; import org.json.JSONException; import java.util.Objects; public class BaseFieldUDF extends UDF{ //只读一次ipip库文件 private static City db = null; public String evaluate(String ip) throws JSONException { StringBuilder sb = new StringBuilder(); try { if (db == null){ db = new City("/usr/local/src/mydatavipday2.ipdb"); } if(Objects.isNull(ip) || "".equals(ip.trim())){ return ""; } //todo 1.174.142.24, 52.46.57.139 ip字段中存在脏数据 需要过滤 String[] split = ip.split(","); try { String[] cns = db.find(split[0], "CN"); if ("".equals(cns[0])){ sb.append("\t"); }else { sb.append(cns[0]).append("\t"); } if ("".equals(cns[1])){ sb.append("\t"); }else { sb.append(cns[1]).append("\t"); } if ("".equals(cns[2])){ sb.append("\t"); }else { sb.append(cns[2]).append("\t"); } if ("".equals(cns[4])){ sb.append("\t"); }else { sb.append(cns[4]).append("\t"); } } catch (IPFormatException e) { // sb.append(e.getMessage()); // e.printStackTrace(); return ""; } } catch (Exception e) { // sb.append(e.getMessage()); // e.printStackTrace(); return ""; } return sb.toString(); } }
- 自定义内部的逻辑 我这边主要解析了4个字段,分别ip对应的国家、省份、城市、运营商 返回一个以\t分割的字符串
- 打包 上传至hdfs相应的目录
- 最后在hive中创建对应的函数
创建的命令:
create function base_ip_analizer as 'com.vision.udf.BaseFieldUDF' using jar 'hdfs://hacluster/user/hive/jars/vision-1.0-SNAPSHOT-jar-with-dependencies.jar';
- 最后使用udf 结果的展示样例 成功解析ip字段
希望大家可以有所收获,别望了点个赞0.0
来源:oschina
链接:https://my.oschina.net/u/4360199/blog/4339182