geoip_fl()
适用于:✅Azure 数据资源管理器
geoip_fl()
是一个用户定义的函数,用于检索 IP 地址的地理信息。
备注
- 请使用原生函数 geo_info_from_ip_address() 而不是本文档所述函数。 本机函数提供相同的功能,并且在性能和可伸缩性方面更好。 本文档仅供参考。
- 此函数从 MaxMind(可从 http://www.maxmind.com 获取)创建的 GeoLite2 数据中检索地理数据。 请查看 GeoLite2 最终用户许可协议。
先决条件
- 必须在群集上启用 Python 插件。 这是函数中使用的内联 Python 所必需的。
语法
T | invoke geoip_fl(
ip_col,
country_col,
state_col,
city_col,
longitude_col,
latitude_col)
详细了解语法约定。
参数
客户 | 类型 | 必需 | 说明 |
---|---|---|---|
ip_col | string |
✔️ | 包含要解析的 IP 地址的列的名称。 |
country_col | string |
✔️ | 用于存储检索到的国家/地区的列的名称。 |
state_col | string |
✔️ | 用于存储检索到的州的列的名称。 |
city_col | string |
✔️ | 用于存储检索到的城市的列的名称。 |
longitude_col | real |
✔️ | 用于存储检索到的经度的列的名称。 |
latitude_col | real |
✔️ | 用于存储检索到的维度的列的名称。 |
函数定义
可以通过将函数的代码嵌入为查询定义的函数,或将其创建为数据库中的存储函数来定义函数,如下所示:
使用以下 let 语句定义函数。 不需要任何权限。
let geoip_fl=(tbl:(*), ip_col:string, country_col:string, state_col:string, city_col:string, longitude_col:string, latitude_col:string)
{
let kwargs = bag_pack('ip_col', ip_col, 'country_col', country_col, 'state_col', state_col, 'city_col', city_col, 'longitude_col', longitude_col, 'latitude_col', latitude_col);
let code= ```if 1:
from sandbox_utils import Zipackage
Zipackage.install('geoip2.zip')
import geoip2.database
ip_col = kargs['ip_col']
country_col = kargs['country_col']
state_col = kargs['state_col']
city_col = kargs['city_col']
longitude_col = kargs['longitude_col']
latitude_col = kargs['latitude_col']
result=df
reader = geoip2.database.Reader(r'C:\\Temp\\GeoLite2-City.mmdb')
def geodata(ip):
try:
gd = reader.city(ip)
geo = pd.Series((gd.country.name, gd.subdivisions.most_specific.name, gd.city.name, gd.location.longitude, gd.location.latitude))
except:
geo = pd.Series((None, None, None, None, None))
return geo
result[[country_col, state_col, city_col, longitude_col, latitude_col]] = result[ip_col].apply(geodata)
```;
tbl
| evaluate python(typeof(*), code, kwargs,
external_artifacts =
pack('geoip2.zip', 'https://artifactschinaeast2.blob.core.chinacloudapi.cn/public/geoip2-4.6.0.zip',
'GeoLite2-City.mmdb', 'https://artifactschinaeast2.blob.core.chinacloudapi.cn/public/GeoLite2-City-20230221.mmdb')
)
};
// Write your query to use the function here.
示例
以下示例使用 invoke 运算符运行函数。
若要使用查询定义的函数,请在嵌入的函数定义后调用它。
let geoip_fl=(tbl:(*), ip_col:string, country_col:string, state_col:string, city_col:string, longitude_col:string, latitude_col:string)
{
let kwargs = bag_pack('ip_col', ip_col, 'country_col', country_col, 'state_col', state_col, 'city_col', city_col, 'longitude_col', longitude_col, 'latitude_col', latitude_col);
let code= ```if 1:
from sandbox_utils import Zipackage
Zipackage.install('geoip2.zip')
import geoip2.database
ip_col = kargs['ip_col']
country_col = kargs['country_col']
state_col = kargs['state_col']
city_col = kargs['city_col']
longitude_col = kargs['longitude_col']
latitude_col = kargs['latitude_col']
result=df
reader = geoip2.database.Reader(r'C:\\Temp\\GeoLite2-City.mmdb')
def geodata(ip):
try:
gd = reader.city(ip)
geo = pd.Series((gd.country.name, gd.subdivisions.most_specific.name, gd.city.name, gd.location.longitude, gd.location.latitude))
except:
geo = pd.Series((None, None, None, None, None))
return geo
result[[country_col, state_col, city_col, longitude_col, latitude_col]] = result[ip_col].apply(geodata)
```;
tbl
| evaluate python(typeof(*), code, kwargs,
external_artifacts =
pack('geoip2.zip', 'https://artifactschinaeast2.blob.core.chinacloudapi.cn/public/geoip2-4.6.0.zip',
'GeoLite2-City.mmdb', 'https://artifactschinaeast2.blob.core.chinacloudapi.cn/public/GeoLite2-City-20230221.mmdb')
)
};
datatable(ip:string) [
'8.8.8.8',
'20.53.203.50',
'20.81.111.85',
'20.103.85.33',
'20.84.181.62',
'205.251.242.103',
]
| extend country='', state='', city='', longitude=real(null), latitude=real(null)
| invoke geoip_fl('ip','country', 'state', 'city', 'longitude', 'latitude')
输出
ip | country | state | city | longitude | latitude |
---|---|---|---|---|---|
20.103.85.33 | 荷兰 | 北荷兰 | 阿姆斯特丹 | 4.8883 | 52.3716 |
20.53.203.50 | 澳大利亚 | 新南威尔士州 | 悉尼 | 151.2006 | -33.8715 |
20.81.111.85 | United States | 弗吉尼亚州 | Tappahannock | -76.8545 | 37.9273 |
20.84.181.62 | United States | 爱荷华州 | Des Moines | -93.6124 | 41.6021 |
205.251.242.103 | United States | 弗吉尼亚州 | Ashburn | -77.4903 | 39.0469 |
8.8.8.8 | United States | California | Los Angeles | -118.2441 | 34.0544 |