【问题标题】: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;
            }
        }
    }
    $$;
    

    【讨论】:

      猜你喜欢
      • 2016-12-04
      • 2021-09-30
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 2016-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多