【问题标题】:GeoIP2 Snowflake Java UDF Integration issueGeoIP2 Snowflake Java UDF 集成问题
【发布时间】:2022-12-15 05:07:51
【问题描述】:
我想在雪花工作表中创建一个 Java UDF,以便查询 GeoIp2 库并获取给定 IP 的 ISO 代码。我有'@AWS_CSV_STAGE/lib/geoip2-2.8.0.jar','@AWS_CSV_STAGE/geodata/GeoLite2-City.mmdb'
已经上演了。我如何将函数处理程序定向到创建数据库读取器的方法,如 Java 文档中所述:
https://dev.maxmind.com/geoip/geolocate-an-ip/databases?lang=en#1-install-the-geoip2-client-library
一般来说,我怎样才能在我的 udf 中实现下面的全部内容?
File database = new File("/path/to/maxmind-database.mmdb")
DatabaseReader reader = new DatabaseReader.Builder(database).build();
InetAddress ipAddress = InetAddress.getByName("128.101.101.101");
CityResponse response = reader.city(ipAddress);
Country country = response.getCountry();
到目前为止我写了这个但当然它不起作用:
无论如何,我找不到太多关于如何解决这类问题的材料。
CREATE OR REPLACE FUNCTION GEO()
returns varchar not null
language java
imports = ('@AWS_CSV_STAGE/lib/geoip2-2.8.0.jar','@AWS_CSV_STAGE/geodata/GeoLite2-City.mmdb')
handler = 'DatabaseReader.Builder';
SELECT GEO();
基本上我想要实现的是在 ip 地址表的一列上调用 UDF,并在另一列中为每个 ip 地址获取国家代码。
【问题讨论】:
标签:
java
snowflake-cloud-data-platform
【解决方案1】:
感谢您提出这个问题——我写了一整篇文章来逐步完成这项工作:
您在发布的代码中有正确的想法,一个完整的工作 UDF 将是:
create or replace function geoip2_country(ip String)
returns string
language java
handler = 'X.x'
imports = ('@fh_jars/geoip2-4.0.0.jar'
, '@fh_jars/maxmind-db-3.0.0.jar'
, '@fh_jars/jackson-annotations-2.14.1.jar'
, '@fh_jars/jackson-core-2.14.1.jar'
, '@fh_jars/jackson-databind-2.14.1.jar')
as $$
import java.io.File;
import java.net.InetAddress;
import com.snowflake.snowpark_java.types.SnowflakeFile;
import com.maxmind.geoip2.model.*;
import com.maxmind.geoip2.DatabaseReader;
import com.maxmind.geoip2.exception.AddressNotFoundException;
class X {
DatabaseReader _reader;
public String x(String ip) throws Exception {
if (null == _reader) {
// lazy initialization
_reader = new DatabaseReader.Builder(SnowflakeFile.newInstance("@fh_jars/GeoLite2-Country.mmdb").getInputStream()).build();
}
try {
return _reader.country(InetAddress.getByName(ip)).getCountry().getIsoCode();
} catch (AddressNotFoundException e) {
return null;
}
}
}
$$;