geoip_fl()

适用于:✅Azure 数据资源管理器

geoip_fl() 是一个用户定义的函数,用于检索 IP 地址的地理信息。

备注

先决条件

  • 必须在群集上启用 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() 的工作示例,请参阅示例

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