clickhouse 根據ip匹配地理資訊

2021-10-10 22:32:07 字數 2330 閱讀 6294

工作中遇到這樣乙個場景,需要根據ip查詢此條資料的省市資訊。

舉例:a表有ip的字段,b表是個ip庫,有ip1和ip2欄位。思路a、b連表查詢,但是條件是 where a.ip between b.ip1 and ip2。

left join 、 inner join on 的條件都不能寫這樣的不等式。

經查clickhouse官網 join | clickhouse documentation 得知 asof join 可以使用不等式,但是經過多種嘗試均以失敗告終,如有哪位大佬用過asof並且成功的歡迎交流一下。

而後發現有 cross join 方法,遂嘗試

查詢語句:

select * from t1 cross join t2 where t1.ipnum between t2.ipnum1 and t2.ipnum2;
查詢結果:

符合預期效果,因此編寫正式語句進行測試,就在這時發現了新的問題,少量資料沒有什麼問題,當資料表有大量資料的時候查詢會非常慢。

我的設計是先有乙個物化檢視,當有一條資料插入時,先插入到了臨時表,然後觸發物化檢視的查詢使用 cross 將省市資訊查出來後和臨時資料一起寫入正式表中。

經查閱資料得知cross join 會導致笛卡爾積,因此數量越大效能越低。ip庫的的資料無法再優化,因此在查詢時where語句中限定了今日的資料並且按時間倒序排序取1條出來,測試後發現效能大大提公升。

方法不一定是最優的,如果有大佬做過類似的場景歡迎交流。

根據IP獲取省市

public class ipaddress 2 0 4 d 25 0 5 01 d d?ip正則 string ip string.empty ip位址 string country string.empty 國家 string adr string.empty 省市 string html ge...

根據網域名稱取出ip

本地網域名稱伺服器採用迭代查詢 假定網域名稱為m.xyz.com的主機想知道另一台主機 網域名稱為y.abc.com 的ip位址。如,主機m.xyz.com打算傳送郵件給主機y.abc.com。這時就必須知道主機y.abc.com的ip位址。下面是圖6 5的幾個查詢步驟 1 主機m.xyz.com先...

根據IP將列表分組

在csdn論壇裡面發現了乙個帖子,問題如下 陣列如下 或者這樣也可以 看到這個問題,我一下就來了興趣,於是有了如下的 片 bin usr python coding utf 8 values def getresult 1 values res ips set values i ip for i i...