Sdílet prostřednictvím


geoip_fl()

geoip_fl() je uživatelem definovaná funkce , která načítá geografické informace ip adresy.

Poznámka:

  • Místo funkce popsané v tomto dokumentu použijte nativní funkci geo_info_from_ip_address( ). Nativní funkce poskytuje stejné funkce a je lepší pro výkon a škálovatelnost. Tento dokument je k dispozici pouze pro referenční účely.
  • Tato funkce načetla geografická data z dat GeoLite2 vytvořených maxMindem, která jsou k dispozici z http://www.maxmind.com. Přečtěte si prosím Licenční smlouvu s koncovým uživatelem GeoLite2.

Požadavky

  • Modul plug-in Pythonu musí být v clusteru povolený. To se vyžaduje pro vložený Python použitý ve funkci.
  • Modul plug-in Pythonu musí být v databázi povolený. To se vyžaduje pro vložený Python použitý ve funkci.

Syntaxe

T | invoke geoip_fl(, ip_col country_col , state_col, city_col longitude_col latitude_col,, )

Přečtěte si další informace o konvencích syntaxe.

Parametry

Název Type Požadováno Popis
ip_col string ✔️ Název sloupce obsahujícího IP adresy, které se mají přeložit.
country_col string ✔️ Název sloupce pro uložení načtené země.
state_col string ✔️ Název sloupce pro uložení načteného stavu.
city_col string ✔️ Název sloupce pro uložení načteného města.
longitude_col real ✔️ Název sloupce pro uložení načtené délky.
latitude_col real ✔️ Název sloupce pro uložení načtené zeměpisné šířky.

Definice funkce

Funkci můžete definovat vložením jejího kódu jako funkce definovanou dotazem nebo vytvořením jako uložené funkce v databázi následujícím způsobem:

Definujte funkci pomocí následujícího příkazu let. Nejsou vyžadována žádná oprávnění.

Důležité

Příkaz let nemůže běžet samostatně. Musí následovat příkaz tabulkového výrazu. Pokud chcete spustit funkční příklad, podívejte se na příkladgeoip_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://artifactswestus.blob.core.windows.net/public/geoip2-4.6.0.zip',
             'GeoLite2-City.mmdb', 'https://artifactswestus.blob.core.windows.net/public/GeoLite2-City-20230221.mmdb')
        )
};
// Write your query to use the function here.

Příklad

Následující příklad používá operátor invoke ke spuštění funkce.

Pokud chcete použít funkci definovanou dotazem, vyvoláte ji po definici vložené funkce.

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://artifactswestus.blob.core.windows.net/public/geoip2-4.6.0.zip',
             'GeoLite2-City.mmdb', 'https://artifactswestus.blob.core.windows.net/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')

Výstup

Ip country state city longitude zeměpisná šířka
20.103.85.33 Nizozemsko Severní Holandsko Amsterdam 4.8883 52.3716
20.53.203.50 Austrálie Nový Jižní Wales Sydney 151.2006 -33.8715
20.81.111.85 USA Virginie Tappahannock -76.8545 37.9273
20.84.181.62 USA Iowa Des Moines -93.6124 41.6021
205.251.242.103 USA Virginie Ashburn -77.4903 39.0469
8.8.8.8 USA Kalifornie Los Angeles -118.2441 34.0544

Tato funkce není podporovaná.