Normalization

通過平面文件將多值欄位載入到 Solr 中,並可能在這些欄位中保存值位置

  • January 25, 2012

我的一個愛好網路項目使用來自許多來源的數據,有些是平坦的,有些是高度標準化的。我的 ETL 過程將所有源歸結為一個邏輯表(很快就會包含一些多值欄位)。最終表被載入到幾個單獨的數據表示環境(基於 Solr 或 MySQL)中。我的 Solr 環境需要一個非規範化模型(它只是將轉換後的輸出表直接載入為平面文件),而我的 MySQL 環境每個都可以使用高度規範化的模型(載入涉及一些規範化)。兩種展示環境載入過程現在都非常簡單。

為了便於在我的 ETL 過程中使用平面文件(這很重要,因為我使用各種工具來匯總和清理數據,並出於性能原因大量使用管道),我已經能夠從使用分組或最佳候選選擇將我的來源添加到單個欄位。

現在我正在設計我需要在輸出中保留的多值欄位。MySQL 載入過程很簡單,因為我已經在考慮這些欄位的情況下對其進行了規範化。但是我在 Solr 部分遇到了問題:

  • 我對 Solr 中的“多值”欄位的經驗為零

  • 平面文件載入過程目前非常簡單,我想盡可能保持簡單

  • 我的多值欄位必須按記錄中的位置進行協調,例如

    • 記錄 X,欄位 A,位置 3 是許可證 #
    • 記錄 X,欄位 B,位置 3 是該許可證的對應狀態

我如何為我計劃保留的多值欄位設計 ETL?

我提出的一些想法遇到了障礙:

  • 使用在平面文件中佔據其自己的行的相同文件鍵引入“附加”記錄

    • 不知道從哪裡開始
  • 將值預組裝到單個欄位中,使用 Solr 解析,例如

    • {$$ [123 $$,$$ 456 $$];$$ [MA $$,$$ CA $$]} -> “123,MA;456,CA”
    • 不確定 Solr 是否可以解壓縮字元串並跨欄位適當地保留位置資訊

我一直無法找到有關協調來自不同欄位的多值欄位值的資訊。考慮到 Solr 本身可能不支持這一點,我仍然對以幾乎與載入平面文件一樣簡單的方式將多值欄位載入到 Solr 的解決方案感興趣。

通過 CSV 將多值數據導入 Solr:

solr 文件描述了 UpdateCSV 中的“拆分”功能。本質上,它使用第二個 CSV 解析器解析欄位值。請參閱Solr-UpdateCSV-split。參數如下所示(根據需要調整欄位名稱、分隔符和封裝器):

f.fieldA.split=true&f.fieldA.separator=%2C&f.fieldA.encapsulator='

從單獨的欄位中獲取多值數據以保持位置:

自從提出這個問題以來,我已經閱讀了一些關於維度模型的內容。似乎我試圖做的是糟糕的設計,因為它對應用程序寄予了太多的期望,或者倉庫的複雜性太高,或者兩者兼而有之。

當試圖在單個記錄上保留兩個欄位值之間的關係時,最好將它們單獨儲存以及一起儲存。這是我以前的輸入與新輸入的比較:

前 CSV 輸入:

name|licenseState|licenseType
Josh|MA,CA|123,456
Fred|MD,OH|789,123

轉換後的 CSV 輸入:

name|licenseState|licenseType|licenseStateType
Josh|MA,CA|123,456|MA123,CA456
Fred|MD,OH|789,123|MD789,OH123

這樣,您的應用程序可以獨立使用 licenseState 和 licenseType 維度值,也可以使用 licenseStateType 維度值,所有這些都不需要復雜的應用程序或倉庫邏輯。

引用自:https://dba.stackexchange.com/questions/6830