GET_IP_INFO

函数概述

 get_ip_info(string ip, string table, string column)

该函数会在运行时根据第二个参数的指定的表名自动加载IP信息库,该表要求至少有 start_ip end_ip列,表示IP范围的闭区间。返回结果为第三个参数指定的column列。

参数说明

参数类型必填说明
ipstring待查询的IP地址(支持IPv4/IPv6格式)
tablestring指定Lakehouse表名字,且表结构需包含start_ipend_ip
columnstring需返回的目标字段名,STRING类型必须是第二个参数table中存在的字段

返回值

  • 匹配成功:返回指定column列的字段值(STRING类型)

使用示例

示例1

  1. 准备IP数据库表
CREATE TABLE IF NOT EXISTS ip_db(
  start_ip   STRING COMMENT 'IP段起始地址',
  end_ip     STRING COMMENT 'IP段结束地址',
  geoname_id STRING,
  country    STRING,
  city       STRING
);

INSERT OVERWRITE TABLE ip_db VALUES
  ("2a7:1c44:39f3:1b::", "2a7:1c44:39f3:1b:ffff:ffff:ffff:ffff", "8070", "USA", "LA"),
  ("2c0f:ffb8::", "2c0f:ffb8:ffff:fff:fff:ffff:ff:ffff", "37210", "CHINA", "BJ"),
  ("1.0.0.0", "1.0.0.255", "5987", "JAPAN", "TOKYO"),  -- 修正城市名拼写
  ("2.0.0.0", "2.0.0.255", "8026", "INDIA", "DELHI");  -- 修正国家名拼写
  1. 执行查询
SELECT 
  ip, 
  get_ip_info(ip, 'ip_db', 'country') AS country
FROM VALUES
  ('2c0f:ffb8:1b::'),  -- IPv6
  ('1.0.0.2'),         -- IPv4
  ('3.0.0.0')          -- 无匹配
AS t(ip);

预期输出

ipcountry
2c0f:ffb8:1b::CHINA
1.0.0.2JAPAN
3.0.0.0NULL

示例2

一、业务背景

需基于IP地址快速获取7维地理信息:

字段说明示例值
country国家名称中国
province省级行政区北京市
city城市名称朝阳区
timezone时区信息Asia/Shanghai
latitude纬度坐标39.9042
longitude经度坐标116.4074
countryCode国家代码CN
continentCode大洲代码AS

二、技术实现

基于Lakehouse内置函数get_ip_info(ip, table_name, column)实现IP解析,底层采用ip2location技术方案。

三、实施流程

1. 数据准备

  • 下载官方数据包 访问MaxMind官网获取最新版GeoLite2-City-CSV数据包(含IPv4/IPv6数据)

  • 转换CIDR为IP段 使用官方转换工具生成可查询的IP范围:

    # 转换IPv4数据
    ./geoip2-csv-converter -block-file GeoLite2-City-Blocks-IPv4.csv \
      -include-range -output-file IPv4_Blocks_Converted.csv
    
    # 转换IPv6数据
    ./geoip2-csv-converter -block-file GeoLite2-City-Blocks-IPv6.csv \
      -include-range -output-file IPv6_Blocks_Converted.csv

    本文使用的是如下两个csv文件,分别是网络 IP地址段表和中国地理信息表

2. 数据建模

(1) IP地址段表 geoip

CREATE TABLE geoip (
  network_start_ip  STRING  COMMENT 'IP段起始地址',
  network_last_ip   STRING  COMMENT 'IP段结束地址',
  geoname_id        STRING  COMMENT '地理位置ID',
  latitude          STRING  COMMENT '纬度',
  longitude         STRING  COMMENT '经度'
)
;

(2) 地理信息表 geolocation

CREATE TABLE geolocation (
  geoname_id        STRING  COMMENT '地理位置ID',
  country_code      STRING  COMMENT '国家代码(ISO 3166)',
  country           STRING  COMMENT '国家名称',
  province          STRING  COMMENT '省级行政区',
  city              STRING  COMMENT '城市名称',
  time_zone         STRING  COMMENT '时区',
  continent_code    STRING  COMMENT '大洲代码'
);

(3) 聚合视图表 geo_lite_info

-- 创建聚合表
CREATE TABLE geo_lite_info (
  start_ip          STRING  COMMENT 'IP段起始',
  end_ip            STRING  COMMENT 'IP段结束',
  country           STRING,
  province          STRING,
  city              STRING,
  timezone          STRING,
  latitude          STRING,
  longitude         STRING,
  country_code      STRING,
  continent_code    STRING
);

-- 数据关联写入
INSERT OVERWRITE TABLE geo_lite_info
SELECT 
  a.network_start_ip,
  a.network_last_ip,
  b.country,
  b.province,
  b.city,
  b.time_zone,
  a.latitude,
  a.longitude,
  b.country_code,
  b.continent_code
FROM geoip a
JOIN geolocation b 
  ON a.geoname_id = b.geoname_id;

四、函数调用

前提条件

  • 目标表geo_lite_info已正确创建且数据就绪
  • IP地址需为规范化格式(支持IPv4/IPv6)

调用示例

-- 单点查询
SELECT 
  get_ip_info('114.246.239.157', 'geo_lite_info', 'city') AS city,
  get_ip_info('2001:4860:4860::8888', 'geo_lite_info', 'timezone') AS tz;

-- 批量查询
SELECT 
  ip,
  get_ip_info(ip, 'geo_lite_info', 'country') AS country,
  get_ip_info(ip, 'geo_lite_info', 'province') AS province
FROM VALUES (('8.8.8.8'), ('114.114.114.114')) AS t(ip);

联系我们
预约咨询
微信咨询
电话咨询