Поделиться через


Подключаемый модуль ipv4_lookup

Подключаемый модуль ipv4_lookup ищет значение IPv4 в таблице подстановки и возвращает строки с совпадающими значениями. Подключаемый модуль вызывается с evaluate помощью оператора .

Синтаксис

T|evaluateipv4_lookup(LookupTable,SourceIPv4Key,IPv4LookupKey [,ExtraKey1 [.. ,ExtraKeyN [,return_unmatched ]]] )

Параметры

Имя Тип Обязательно Описание
T string ✔️ Табличные входные данные, столбец которого SourceIPv4Key используется для сопоставления IPv4.
LookupTable string ✔️ Табличное или табличное выражение с данными подстановки IPv4, столбец LookupKey которого используется для сопоставления IPv4. Значения IPv4 можно маскировать с помощью нотации IP-префикса.
SourceIPv4Key string ✔️ Столбец T со строкой IPv4 для поиска в LookupTable. Значения IPv4 можно маскировать с помощью нотации IP-префикса.
IPv4LookupKey string ✔️ Столбец LookupTable со строкой IPv4, которая сопоставляется с каждым значением SourceIPv4Key .
ExtraKey1 .. ExtraKeyN string Дополнительные ссылки на столбцы, используемые для поиска совпадений. join Аналогично операции: записи с равными значениями считаются совпадающими. Ссылки на имена столбцов должны существовать как в исходной таблице T , так и LookupTableв .
return_unmatched bool Логический флаг, определяющий, должен ли результат включать все или только совпадающие строки (по умолчанию: false — возвращаются только соответствующие строки).

Нотация ip-префикса

Нотация IP-префикса (также известная как нотация CIDR) — это краткий способ представления IP-адреса и связанной с ним маски сети. Формат — <base IP>/<prefix length>, где длина префикса — это число ведущих 1 бита в маске сети. Длина префикса определяет диапазон IP-адресов, принадлежащих сети.

Для IPv4 длина префикса — это число от 0 до 32. Таким образом, нотация 192.168.2.0/24 представляет IP-адрес 192.168.2.0 с маской сети 255.255.255.0. Эта маска сети имеет 24 начального 1 бита или длину префикса 24.

Для IPv6 длина префикса — это число от 0 до 128. Таким образом, нотация fe80::85d:e82c:9446:7994/120 представляет IP-адрес fe80::85d:e82c:9446:7994 с маской сети ffff:ffff:ffff:ffff:ffff:ffff. Эта маска сети содержит 120 ведущих 1 бит или длину префикса 120.

Возвращаемое значение

Подключаемый ipv4_lookup модуль возвращает результат соединения (поиска) на основе ключа IPv4. Схема таблицы представляет собой объединение исходной таблицы и таблицы подстановки, аналогично результату lookup оператора .

Если аргумент return_unmatched имеет значение true, результирующая таблица содержит как совпадаемые, так и несопоставимые строки (заполненные значениями NULL).

Если аргумент return_unmatched имеет значение falseили опущен (используется значение false по умолчанию), результирующая таблица содержит столько же записей, сколько соответствующих результатов. Этот вариант поиска имеет лучшую производительность по сравнению с выполнением return_unmatched=true .

Примечание

  • Этот подключаемый модуль охватывает сценарий соединения на основе IPv4, при условии, что таблица подстановки небольшого размера (100–200 000 строк) при необходимости имеет больший размер входной таблицы.
  • Производительность подключаемого модуля будет зависеть от размеров таблиц подстановки и источников данных, количества столбцов и количества соответствующих записей.

Примеры

Поиск по протоколу IPv4 — только соответствующие строки

// IP lookup table: IP_Data
// Partial data from: https://raw.githubusercontent.com/datasets/geoip2-ipv4/master/data/geoip2-ipv4.csv
let IP_Data = datatable(network:string, continent_code:string ,continent_name:string, country_iso_code:string, country_name:string)
[
  "111.68.128.0/17","AS","Asia","JP","Japan",
  "5.8.0.0/19","EU","Europe","RU","Russia",
  "223.255.254.0/24","AS","Asia","SG","Singapore",
  "46.36.200.51/32","OC","Oceania","CK","Cook Islands",
  "2.20.183.0/24","EU","Europe","GB","United Kingdom",
];
let IPs = datatable(ip:string)
[
  '2.20.183.12',   // United Kingdom
  '5.8.1.2',       // Russia
  '192.165.12.17', // Unknown
];
IPs
| evaluate ipv4_lookup(IP_Data, ip, network)

Выходные данные

ip network continent_code continent_name country_iso_code country_name
2.20.183.12 2.20.183.0/24 EU Европа ГБ United Kingdom
5.8.1.2 5.8.0.0/19 EU Европа RU Россия

Подстановка IPv4 — возвращает как совпадающие, так и несовпадющие строки.

// IP lookup table: IP_Data
// Partial data from: 
// https://raw.githubusercontent.com/datasets/geoip2-ipv4/master/data/geoip2-ipv4.csv
let IP_Data = datatable(network:string,continent_code:string ,continent_name:string ,country_iso_code:string ,country_name:string )
[
    "111.68.128.0/17","AS","Asia","JP","Japan",
    "5.8.0.0/19","EU","Europe","RU","Russia",
    "223.255.254.0/24","AS","Asia","SG","Singapore",
    "46.36.200.51/32","OC","Oceania","CK","Cook Islands",
    "2.20.183.0/24","EU","Europe","GB","United Kingdom",
];
let IPs = datatable(ip:string)
[
    '2.20.183.12',   // United Kingdom
    '5.8.1.2',       // Russia
    '192.165.12.17', // Unknown
];
IPs
| evaluate ipv4_lookup(IP_Data, ip, network, return_unmatched = true)

Выходные данные

ip network continent_code continent_name country_iso_code country_name
2.20.183.12 2.20.183.0/24 EU Европа ГБ United Kingdom
5.8.1.2 5.8.0.0/19 EU Европа RU Россия
192.165.12.17

Поиск по протоколу IPv4 — использование источника в external_data()

let IP_Data = external_data(network:string,geoname_id:long,continent_code:string,continent_name:string ,country_iso_code:string,country_name:string,is_anonymous_proxy:bool,is_satellite_provider:bool)
    ['https://raw.githubusercontent.com/datasets/geoip2-ipv4/master/data/geoip2-ipv4.csv'];
let IPs = datatable(ip:string)
[
    '2.20.183.12',   // United Kingdom
    '5.8.1.2',       // Russia
    '192.165.12.17', // Sweden
];
IPs
| evaluate ipv4_lookup(IP_Data, ip, network, return_unmatched = true)

Выходные данные

ip network geoname_id continent_code continent_name country_iso_code country_name is_anonymous_proxy is_satellite_provider
2.20.183.12 2.20.183.0/24 2635167 EU Европа ГБ Соединенное Королевство 0 0
5.8.1.2 5.8.0.0/19 2017370 EU Европа RU Россия 0 0
192.165.12.17 192.165.8.0/21 2661886 EU Европа SE Швеция 0 0

Поиск по протоколу IPv4 — использование дополнительных столбцов для сопоставления

let IP_Data = external_data(network:string,geoname_id:long,continent_code:string,continent_name:string ,country_iso_code:string,country_name:string,is_anonymous_proxy:bool,is_satellite_provider:bool)
    ['https://raw.githubusercontent.com/datasets/geoip2-ipv4/master/data/geoip2-ipv4.csv'];
let IPs = datatable(ip:string, continent_name:string, country_iso_code:string)
[
    '2.20.183.12',   'Europe', 'GB', // United Kingdom
    '5.8.1.2',       'Europe', 'RU', // Russia
    '192.165.12.17', 'Europe', '',   // Sweden is 'SE' - so it won't be matched
];
IPs
| evaluate ipv4_lookup(IP_Data, ip, network, continent_name, country_iso_code)

Выходные данные

ip continent_name country_iso_code network geoname_id continent_code country_name is_anonymous_proxy is_satellite_provider
2.20.183.12 Европа ГБ 2.20.183.0/24 2635167 EU Соединенное Королевство 0 0
5.8.1.2 Европа RU 5.8.0.0/19 2017370 EU Россия 0 0