開放台灣民間租屋資料打包回家玩關於資料集部落格
消除重複住宅邏輯更新

消除重複住宅邏輯更新

為了節省計算資源、簡化季度、年度資料處理流程,我們將從「使用 PostgresSQL 合併跨月資料」,改為「使用 ClickHouse local 合併跨月資料」。除了少數欄位名稱更改外,使用上並無其餘影響。

對新合併法有興趣者,歡迎參見合併原始碼

以下將以「原合併法」代稱「使用 PostgresSQL 合併跨月資料」,「新合併法」代稱「使用 clickhouse-local 合併跨月資料」。

調整的欄位(只影響消除重複住宅):

  1. 「最大刊登者編碼」改為「常見刊登者編碼」
  2. 「約略地點範圍」改為兩個欄位:「常見約略地點_x」、「常見約略地點_y」
  3. 新增「物件最後更新時間」

兩種合併法的資料解釋差異

新合併法的主要特性為:

  1. 傾向使用「最常出現的數值」,而非「最新出現的數值」
  2. 因為上述原因,在「消除重複住宅資料集」中,合併的標的將由原本的「各住宅的各欄位的最新的數值」,改為「各住宅各欄位最常出現的數值」

在新合併法中,針對時間類型以外的欄位,我們使用 anyHeavy 當作合併的方法,而非原本的 last ,也就是說,資料集會呈現此同一個物件中「最常出現」,而非「最後一個月份出現」的數值。以「常見刊登者編碼」為例,假設某個物件在 2021 年 1 月、2 月、3 月都出現過,且刊登者編碼分別為 A、A、B,那麼在新合併法中,此物件的「常見刊登者編碼」為 A,而非原合併法中的 B。

在「消除重複住宅資料集」中,新原合併法的流程方別為:

  1. 原合併法:
    1. 針對「儲存各物件最新數值的資料表」,以表訂的共同欄位合併
  2. 新合併法:
    1. 下載對應的各月份資料集
    2. 以物件編號為索引,合併為單一資料集,合併時留用最常出現的數值
    3. 針對合併後的單一資料集,以表訂的共同欄位合併

由於新合併法流程上的設計,自 2023 起的季度、年度「消除重複住宅資料集」,將會使用「以月為單位,最常出現的數值」為物件最後的數值。

新合併法的優點

  1. 執行速度、費用均顯著減少
    1. 由於原仰賴 PostgresSQL,需要較多設定、記憶體,才能執行幾十萬筆資料的合併,以季度資料為例,至少需要 16GB 記憶體,執行至少 4 小時。
    2. 新合併法無須架設伺服器,僅需以個人電腦執行,大約 30 秒即可完成季度資料的整併。
  2. 修正就合併法的問題
    1. 在檢查新合併法的資料正確性時發現,由於原合併法使用 Django ORM 撰寫 SQL ,因此在特定情況下,沒有將「不同月份,標為不同出租狀態的同物件」合併的情況,新合併法則正確合併這類物件。

歡迎自行調整合併邏輯

由於新合併法的執行成本、環境需求均遠低於原合併法,因此也更適合由資料分析者自行調整合併的邏輯,以符合各自的需求。

若有需要自行調整合併邏輯的需求,可參考資料合併小幫手原始碼

ClickHouse local 使用小秘訣

  1. 由於這裡的 CSV 資料集,都是用 - 作為空白欄位的標記,因此下 SQL 時,記得在開頭加上 SET format_csv_null_representation = '-'; ,讓 ClickHouse 自行轉換空白值,讓欄位資料型態判斷更準確。
  2. 除了 anyHeavy 外,ClickHouse 也有提供不少 aggregation 函式,例如 topK groupArray ,可以顯示合併前的多筆數值,更多用法可參考 Aggregate Functions
    1. 要注意的是,由於使用 ClickHouse 時, 無法指定各 CSV 檔的匯入順序,因此使用 last_value 時,並無法保證一定是最後一個月的資料。