如果我错了,请纠正我,但是我对斯诺公园中的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/
我的代码:
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代码,我想在雪花工作表上这样做。
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();发布于 2022-12-02 04:16:32
看起来更复杂的是:
要在雪花中使用
,
libmaxminddb。但这将更加困难,因为您可以看到它们的文档不像其他pip可安装C库那样提供一种简单的方式。所以这会很复杂。
还有其他可供选择的路径,比如提供这种功能的商业提供商(如我在这里描述的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)。
现在是重建雪花的时候了。但是谁(我?)什么时候仍然是个问题。
https://stackoverflow.com/questions/74649140
复制相似问题