首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建一个Java,它将geoip2库与S3桶中的数据库一起使用

创建一个Java,它将geoip2库与S3桶中的数据库一起使用
EN

Stack Overflow用户
提问于 2022-12-01 23:08:39
回答 1查看 40关注 0票数 1

如果我错了,请纠正我,但是我对斯诺公园中的UDF函数的理解是,您可以从您的IDE中发送UDF函数,它将在雪花中执行。我有一个名为GeoLite2-City.mmdb的阶段性数据库,位于我的雪花帐户的S3桶中,我想使用它来检索有关ip地址的信息。所以我的策略是

1注册一个UDF,它将返回一个响应字符串,在我的IDE Pycharm 2中创建一个主函数,它将简单地询问有关ip地址的数据库并给我一个响应。问题是,UDF和我的代码如何在我的桶中看到s3://path/GeoLite2-City.mmdb上的阶段性文件,在我的例子中,我简单地假设它最终会找到它(使用geoip2.database.Reader('GeoLite2-City.mmdb')作为读者:),因为stage_location='@AWS_CSV_STAGE‘与保存UDF是一样的?但我不确定我是否正确地理解了stage_location所指的选项。

目前,我得到了以下错误:

“无法添加包geoip2,因为Anaconda术语必须被ORGADMIN接受才能使用Anaconda第三方包。请按照https://docs.snowflake.com/en/developer-guide/udf/python/udf-python-packages.html#using-third-party-packages-from-anaconda."的说明操作。

我是否正确地导入了Geoip2数据库,以便将其与斯诺登和udf一起使用?我是否通过编写session.add_packages('geoip2')来导入它?谢谢你澄清我的疑虑。我所遵循的关于geoip2的说明就在这里。https://geoip2.readthedocs.io/en/latest/

我的代码:

代码语言:javascript
复制
from snowflake.snowpark import Session

import geoip2.database

from snowflake.snowpark.functions import col

import logging

from snowflake.snowpark.types import IntegerType, StringType

 

logger = logging.getLogger()

logger.setLevel(logging.INFO)

 

session = None

user = ''*********'

password = '*********'

account = '*********'

warehouse = '*********'

database = '*********'

schema = '*********'

role = '*********'

 

print("Connecting")

cnn_params = {

"account": account,

"user": user,

"password": password,

"warehouse": warehouse,

"database": database,

"schema": schema,

"role": role,

}

 

def first_udf():

with geoip2.database.Reader('GeoLite2-City.mmdb') as reader:

response = reader.city('203.0.113.0')

print('response.country.iso_code')

return response

 

try:

print('session..')

session = Session.builder.configs(cnn_params).create()

session.add_packages('geoip2')

 

session.udf.register(

func=first_udf

, return_type=StringType()

, input_types=[StringType()]

, is_permanent=True

, name='SNOWPARK_FIRST_UDF'

, replace=True

, stage_location='@AWS_CSV_STAGE'

)

 

session.sql('SELECT SNOWPARK_FIRST_UDF').show()

 

except Exception as e:

print(e)

finally:

if session:

session.close()

print('connection closed..')

print('done.')

我正在尝试使用java来解决这个问题,就像在我的临时区一样,我已经有了一个'geoip2-2.8.0.jar‘库。如果我能导入它的方法,以获得一个国家的知识产权,它将是完美的,问题是,我不知道如何准确地做它。我正试着遵循这些指示,https://maxmind.github.io/GeoIP2-java/。我想查询数据库并输出国家的iso代码,我想在雪花工作表上这样做。

代码语言:javascript
复制
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 = 'test'
as
$$
def test():
  File database = new File("geodata/GeoLite2-City.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();
  System.out.println(country.getIsoCode());
$$;

SELECT GEO();
EN

回答 1

Stack Overflow用户

发布于 2022-12-02 04:16:32

看起来更复杂的是:

要在雪花中使用

  • ,您需要接受Anaconda术语。这是很容易的,如果你可以问你的帐户管理。

所以这会很复杂。

还有其他可供选择的路径,比如提供这种功能的商业提供商(如我在这里描述的https://medium.com/snowflake/new-in-snowflake-marketplace-monetization-315aa90b86c)。

还有其他方法可以在不使用付费数据集的情况下完成这一任务,但我还没有写过这方面的文章--但在我开始之前,其他人可能会这样做。

顺便说一句,几年前我为BigQuery (https://cloud.google.com/blog/products/data-analytics/geolocation-with-bigquery-de-identify-76-million-ip-addresses-in-20-seconds)写了这样的文章,但今天我被告知谷歌最近删除了我与世界共享的表(https://twitter.com/matthew_hensley/status/1598386009129058315)。

现在是重建雪花的时候了。但是谁(我?)什么时候仍然是个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74649140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档