目录
1. Impala使用ip2region转换地址
?1.1- 新建maven项目,编写java程序实现ip转换地址。
1.2- 下载ip2reigion, 并把ip2region.db文件复制到maven项目的resource目录中?
?1.3- 编写java程序
1.4- 打包编译, 上传hdfs省略
1.5- impala注册自定义udf函数
使用第三方转换项目 ip2region
1. Impala使用ip2region转换地址
使用java实现转换程序后,编译打包,上传jar包。然后注册 自定义UDF函数,在sql中使用自定义UDF函数 ?
?1.1- 新建maven项目,编写java程序实现ip转换地址。
引入ip2region包。引入hutool包(用来加载ip2region.db文件),引入hive,用来自定义UDF。pom文件内容如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>IP2Addre</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.21</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/java/</sourceDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
</excludes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.db</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<verbose>true</verbose>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.8.1</version>
<configuration>
<includes>
<include>**/*.java</include>
<include>**/*.scala</include>
</includes>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
1.2- 下载ip2reigion, 并把ip2region.db文件复制到maven项目的resource目录中
?1.3- 编写java程序
我这里是 省份和城市分开获取,所以自定义了两个 UDF类
解析ip的方法
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.resource.ClassPathResource;
import org.lionsoul.ip2region.*;
import java.io.InputStream;
public class IP2Address {
private volatile static IP2Address ip2Addre;
private static ClassPathResource resource ;
private static InputStream is ;
private static DbConfig config ;
private static DbSearcher searcher ;
private IP2Address (){}
// 单例模式
public static IP2Address getSingleton() throws DbMakerConfigException {
if (ip2Addre == null) {
synchronized (IP2Address.class) {
if (ip2Addre == null) {
ip2Addre = new IP2Address();
resource = new ClassPathResource("ip2region.db");
is = resource.getStream();
config = new DbConfig();
searcher = new DbSearcher(config, IoUtil.readBytes(is));
}
}
}
return ip2Addre;
}
/** 使用ip2region 将 ip 转换为 地址 “ 中国|0|广东省|广州市|电信 ”
* @params string ip
* @return string address, 格式是 “ 国家|x|省份|城市|运营商”
* */
public static String getAddresByIp(String ip){
try {
DataBlock dataBlock = null;
if ( Util.isIpAddress(ip) == false ) {
System.out.println("Error: Invalid ip address");
}
dataBlock = searcher.memorySearch(ip);
return dataBlock.getRegion();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
?自定义UDF类, 获取省份。 继承 UDF
public class GetProvinceByIp extends UDF {
public String evaluate(String ip) throws DbMakerConfigException {
IP2Address ipUtil = IP2Address.getSingleton();
String addrStr = ipUtil.getAddresByIp(ip);
System.out.println("addres is : " + addrStr); // 调试,正式使用可以注释
String[] addr = addrStr.split("\\|");
if (addr.length != 5){
return "未知" ;
}
return addr[2] ;
}
}
?自定义UDF类, 获取城市。 继承 UDF
import org.apache.hadoop.hive.ql.exec.UDF;
import org.lionsoul.ip2region.DbMakerConfigException;
public class GetCityByIp extends UDF {
public String evaluate(String ip) throws DbMakerConfigException {
IP2Address ipUtil = IP2Address.getSingleton();
String addrStr = ipUtil.getAddresByIp(ip);
String[] addr = addrStr.split("\\|");
if (addr.length != 5){
return "未知" ;
}
return addr[3] ;
}
}
? 测试类
public class Test {
public static void main(String[] args) throws DbMakerConfigException {
GetProvinceByIp addByIp = new GetProvinceByIp();
String ip = "59.37.3.98";
String province = addByIp.evaluate(ip);
System.out.println(province);
GetCityByIp getCityByIp = new GetCityByIp();
String city = getCityByIp.evaluate(ip);
System.out.println(city);
}
}
1.4- 打包编译, 上传hdfs省略
1.5- impala注册自定义udf函数
临时注册:
create function 《自定义udf名(输入类型)》 returns string location '《jar包路径》' symbol='《类路径》'
?例如获取省份的自定义UDF:?
create function ip2province(string) returns string location '/dap/jars/IP2Addre.jar' symbol='com.zhang.util.GetProvinceByIp'
?可以在impala的sql里面使用ip2province将ip转换为省份了。
城市udf一样操作。
spark的使用
sparkSql也可以使用自定义UDF函数。
spark core则可以直接定义工具类,里面定义一个方法进行ip转换。
在使用的时候调用这个工具类的方法即可。
工具类的代码和上述的 java代码一致。这里就不重复了
|