數據遷移面臨諸多挑戰
導讀:數據改寫與數據遷移面臨重大挑戰--但也收獲巨大。
在過去十年,我經常需要面對無數次的數據改寫任務,無論是從舊有的數據庫遷移到新的數據庫,還是利用新的程序工具發掘大量數據系列,又或者是其他的大量任務,以某種形式得到數據并以新的方式轉存為數據,這樣的事情每時每刻都會頻繁發生。對包括IT人在內的大多數人,數據改寫和遷移都只是個虛幻的魔法。
讓我們花幾分鐘的時間來解釋下整個過程是怎么運作的。大家可能會發現,引用這些有助于向那些不太懂技術的人溝通講解比較微妙的后端技術流程。
一切先從Excel開始
我們選擇一個不太幸運的常見情形:可怕的Excel電子表格。一段時間以前,有一家很遙遠的公司,他們確定需要收集涉及到商業流程的數據--庫存、銷售、客戶等企業擁有的所有數據。由于缺乏合適的工具,有個人利用Excel電子表格完成了這項工作。隨著時間的流逝,數以千計的記錄大量積聚,Excel表格變得越來越沒有用處,最終該公司決定將所有數據轉到真正的數據庫中,他們聘請了咨詢團隊,定義了內部資源,***派一個人接手了該任務。
首先要做的就是檢查數據本身的干凈度。在一個***的世界,電子表格有點類似于數據庫,每一列都有公共區塊--如名字、姓氏、街道、城市等等。然而,運作的方法并不總是這樣,布局有可能自上而下,信息包含在同一列下單獨的行中,如聯系列下有全稱、公司、地址、手機號碼等單獨的行。下一列則有可能是2012年***的訂單或銷售或其他數據,這帶來了一個更具挑戰性的問題。
讓我們看看***種情況,這種最為簡單。數據相對清晰,結構明顯,可以方便地外移到CSV上,通過自定義的解析器將其轉化為一個數據庫。好的CSV解析器可以將所有記錄拉到一個數組中,數組可以剝離不同的數據記錄,并嵌入到新的數據庫中。完成這些流程后,我們能檢查數據,也能修改數據,以更好地適應新數據庫的格式。
舉例來說,我們可能會在一個電話號碼字段中運行正則表達式,將各種各樣的手機號碼格式轉換成一種標準格式,這需要折騰所有的特殊字符,重新設定結果串,然后才能將數據嵌入到新的數據庫。這種才做會將數字如(212)555-1212、212-555-1212、2125551212、212 555 1212、212.555.1212等轉換為類似(212)555-1212的標準格式,有助于可讀性和搜索。
我們可能用類似/[^0-9]+/的正則表達式卸除這些內容,然后用如/([0-9]{3})([0-9]{3})([0-9]{4})/這樣的正則表達式再將它們重新組合,***匹配結果是212、555和1212。我們現在可以我們喜歡的任何格式來重新設定手機號碼,如果我們碰到一個數字,因為數位過多或過少而不能成為手機號碼數字時,我們也能擺脫困境。
形式自由一切都自由
當我們進入到更自由的表單字段后,情況變得更為不確定。確定地址特別麻煩,因為設定地址格式有各種各樣不同的方法。我們也需要面對大量的街道和城市名,需要確定我們是否正確地掌握了“Washington, DC” 、“Washington/DC” 、“Washington DC”,以及一些類似“Winston-Salem DC”、“King of Prussia, PA”、“Scranton, Penn” “N. Providence RI”、 “Houston, TX”和“O’Fallon, IL”等古怪的地名。
這些各種各樣的變化能讓解析器犯錯,因為我們不能消除某些特殊的字符。此外,我們不能指望一個城市的數據量能跟一個州,或州內現存和擁有的縮寫的數據量相比。因此,我們需要構造條件表達式,凝成一股勁來盡***努力確定實際的城市和州,甚至需要對美國的每一個城市和每一個州的數據庫進行核對。根據結果,我們仍然需要在該記錄上擺脫困境,如果沒法做出確定的決斷,至少提出一個需要手動檢查的問題的記錄。
我們現在才僅僅開始發現事情的表象,還有大量的工作,就是搞清楚每一個記錄中的城市、州、手機號碼等,根據內容,我們需要沖洗并重復電子表格中的每一個其他字段。
這種混亂的直接結果是,不受約束的自由形式的數據項,無時無刻無論何地都困擾著每家公司,而且它不一定是Excel形式。數據項可以是Access,一個自主開發的數據庫,或者其他任何應用程序。除非能檢查輸入的數據的有效性和格式,否則這些數據很可能只是一個爛攤子。當然,問題的關鍵是建立一個合適的數據庫前端來處理數據的輸入:我們可以清理修飾數據進入的方式,這樣能持續提高數據的準確性和可用性,這是擺在首位的使用數據庫的好處之一。
但是,我們不能忽視在后端處理這種類型的數據集所付出的努力,現在也已經開發了各種工具來簡化流程,但他們并不能適用于所有情況。雖然他們可能對輸入數據的某部分起作用,不能起作用的部分可能導致使用那些工具更加困難重重。
這種性質的工作十分乏味,尤其注重細節,要求大量的手工數據檢驗、試運行、調試,同時需要在該項目上工作的部分的開發者具備前瞻性思維。當上面說到的所有東西都實現了,結果肯定是:我們的付出是值得的。
使用干凈的數據,一切都變得很簡單,只要別低估清理數據的旅途中可能面臨的巨大挑戰就行。