Получение информации по IP-адресу в Clickhouse

Еще одна недокументированная, на данный момент, возможность — это получение информации по IP-адресу.

В ClickHouse существует механизм словарей, для работы с IP-адресами необходимо выбрать в качестве способа размещения словаря в памяти (layout) — ip_trie. Описание словаря никак не отличается от обычного и в качестве источника можно выбирать любой из доступных.

Рассмотрим на примере локального файла в формате CSV.

<?xml version="1.0" encoding="UTF-8"?>
<dictionaries>
   <dictionary>
      <name>GEOIP</name>
      <source>
         <file>
            <path>/tmp/ip_trie.csv</path>
            <format>CSV</format>
         </file>
      </source>
      <lifetime>300</lifetime>
      <layout>
         <ip_trie />
      </layout>
      <structure>
         <key>
            <attribute>
               <name>prefix</name>
               <type>String</type>
            </attribute>
         </key>
         <attribute>
            <name>Country</name>
            <type>String</type>
            <null_value />
         </attribute>
         <attribute>
            <name>Owner</name>
            <type>String</type>
            <null_value />
         </attribute>
      </structure>
   </dictionary>
</dictionaries>

При этом в файле для prefix указывается сеть и длина префикса.

87.250.250.0/24,RU,YANDEX
8.8.8.0/24,USA,Google LLC

Для получения информации обращаемся к словарю с помощью стандартных функций.

Пример получения страны по IP-адресу:

:) SELECT  dictGetString('GEOIP', 'Owner', tuple(IPv4StringToNum('8.8.8.8')))
SELECT dictGetString('GEOIP', 'Owner', tuple(IPv4StringToNum('8.8.8.8')))
┌─dictGetString(\'GEOIP\', \'Owner\', tuple(IPv4StringToNum(\'8.8.8.8\')))─┐
 Google LLC                                                                             
└────────────────────────────────────────────────────────────────────────────────────┘