如今,正確有效的數據管理至關重要,因為數據中蘊含著寶貴的信息。在本文中,我們將討論數據管理的一些基礎知識,從結構化數據和非結構化數據之間的差異到 OLAP 和OLTP之間的差異。此外,我們還將討論 ETL/ELT、數據湖和數據倉庫等關鍵概念。
一 結構化數據與非結構化數據
在數據上下文中,了解結構化數據和非結構化數據之間的區別至關重要。前者是指具有特定和定義格式的數據類型,例如數據庫表,其中表中的每個字段都包含特定類型的數據(字符串、整數等)。
另一方面,非結構化數據是一種不遵循先前定義的模式的數據類型,但它很靈活,因此難以在表或數據庫內組織,例如電子郵件、音頻或視頻文件等。
圖 1. 結構化數據與非結構化數據的示例
如今,這兩種類型的數據都發揮著非常重要的作用,并且各有優缺點。 其中一些是:
表 1.結構化和非結構化數據的比較
此示例說明了結構化數據和非結構化數據之間的區別。結構化數據按定義的字段組織,而非結構化數據則是純文本,可能需要進行額外分析才能提取相關信息。
導入csv
# 從 CSV 文件加載結構化數據
with open ( 'clients.csv' , mode= 'r' ) as csv_file:
csv_reader = csv.DictReader(csv_file)
for row in csv_reader:
first_name = row[ 'first_name' ]
last_name = row[ 'last_name' ]
age = row[ 'age' ]
email = row[ 'email' ]
print ( "First name:" , first_name)
print ( "Last name:" , last_name)
print ( "Age:" , age)
print ( "Email:" , email)
# 輸出結構化數據:
# First name: John
# Last name: Doe
# Age: 35
# Email: john.doe@example.com
# …
# 從 txt 文件加載非結構化數據(客戶評論)
with open ( 'customer_views.txt' , mode= 'r' ) as txt_file:
意見 = txt_file.read().split( '\n\n' )
for i, opinion in enumerate (opinions, 1 ):
print ( f"Opinion {i} :" )
# 非結構化數據輸出:
# 意見 1:今天我在你的商店度過了一段美妙的時光。工作人員非常友好和樂于助人。
# …
二、 數據倉庫
數據倉庫是一種以結構化和集中化的方式存儲大量數據的系統。它們允許將來自不同來源的數據轉換并集成到一個單一、連貫的地方,以便進行后續分析,從而獲得見解并支持決策。
數據始終保持最新且可訪問非常重要,為了提高數據質量,數據倉庫通常需要清理和驗證流程來提高質量和完整性。但不利的一面是,數據倉庫的維護成本往往較高,因為它們必須滿足上述幾點。
除了數據倉庫之外,數據架構中還有其他重要組件:
數據集市:這些是數據倉庫的子集,旨在滿足組織特定職能領域(例如銷售或財務(部門))的分析需求,或者可以根據地理區域或產品線(分布式)創建。
Data Vault:
它是一個數據倉庫設計模型,由三個組件組成:
中心:代表關鍵概念,例如客戶,通常在具有唯一標識符(主鍵)的單個表中建模。
鏈接:表示中心之間的鏈接或關系,通常作為單獨的表和外鍵。
衛星:表示中心或鏈接的描述屬性,通常作為單獨的表和外鍵。
這種設計有助于數據審計、數據沿襲和新數據集成,提供更大的靈活性和可擴展性。
三 、數據湖
數據湖是一個集中式數據存儲庫,允許以原始格式(即未經事先處理的數據)存儲、管理和共享大量數據。這就是為什么數據湖不需要預定義的模式,而是可以以不同的格式(結構化、半結構化和非結構化數據)存儲數據,甚至不知道它們將來會如何使用,而數據倉庫則需要事先轉換數據,以使其符合定義的模式。
數據湖的靈活性使其成為希望執行高級分析并發現傳統系統預處理中可能被消除的有價值信息的組織的理想系統。此外,由于不強加僵化的結構,數據探索和分析是敏捷的,沒有限制。
最后,集成來自不同來源和格式的數據的選項使數據湖成為一個集中且高度可擴展的地方,用于存儲來自整個組織的原始數據,即,它們充當組織內不同團隊和領域之間協作的交匯點,提高部門之間的協同作用以及基于可靠和全面數據的決策。
實施數據湖的最佳實踐
數據湖的實施對于企業環境中數據管理和分析的成功至關重要。以下是一些有效和高效實施數據湖的最佳實踐。
將數據湖劃分為多個層(或區域)
為了改善數據湖中數據的組織和可訪問性,建議將其分為多個層,每個層包含特定類型的數據并用于不同的目的。最常見的層是:
原始/青銅/貼源層:顧名思義,此層包含原始形式的數據,即從不同數據源接收的數據。此層包含未執行任何轉換的數據,因此它充當數據提取的入口點。此外,此層中的數據永久存儲(不可變)并作為歷史記錄。
一致/標準化層:通常,原始數據以不同的格式(例如 CSV、JSON 等)輸入。此層將所有這些格式轉換為標準格式,通常是 Parquet,這是一種針對處理大量數據進行優化的存儲類型,以便我們獲得一致且優化的數據以供進一步分析。
清潔/銀/處理層:此層充當過濾器,因為在這里對數據進行轉換(清潔、集成和合并),以獲得模式和格式統一的層。此外,可以規范化數據并添加元數據以方便可追溯性和高效搜索。
表示層/黃金層/應用層:使用來自上一層的已清理數據,將業務規則應用于數據,以便最終用戶(例如數據科學家或分析應用程序)可以使用這些數據。還可以應用轉換來增強和豐富數據,例如通過應用聚合或摘要。
沙盒/探索層:此層可以選擇性開發,因為它通常是原始層的副本,可以在其中讀取和修改數據。從數據科學家的角度來看,這是一個有用的層,因為他們可以在不丟失任何信息(無轉換)的情況下探索數據,并且具有很大的靈活性。除了作為可選層之外,如果需要,還可以構建多個此類層。
圖 2.數據湖層
創建文件夾結構
另一個好的做法是在數據湖中創建文件夾結構,以便可以有效地訪問數據。根據組織的興趣,可以通過多種方式實現此文件夾結構:
數據隔離:根據數據的來源、數據類型或業務單元對數據進行分離。它方便數據科學家訪問數據,以便他們能夠檢索與其用例相關的數據。
訪問控制:如果數據必須具有不同級別的權限,則使用訪問控制,以便組織中并非所有用戶都可以訪問所有數據。在這種情況下,必須定義訪問策略。
合規性要求:將敏感數據存儲在不同的文件夾中可能很有趣,這樣它們就有更嚴格的隱私和安全策略。
備份和災難恢復:根據備份頻率,可以有不同類型的文件夾。例如,有一個經常備份的文件夾,其中包含永遠不會丟失的數據,或者相反,有一個從不備份的文件夾,因為它包含不需要存儲的數據,因為這些數據可以重新生成。
實施審計和誠信控制
對于任何數據湖來說,設計一系列機制來保證數據在從一層傳遞到另一層時不會遭受更改至關重要。這些機制是:
數據審計:存儲對數據所做的所有修改,以保證可追溯性。
完整性檢查:通過一系列自動檢查來驗證整個轉換過程中數據的一致性。例如,如果執行了格式轉換,則必須驗證源中存在的文件數量與目標中存在的文件數量是否相同,如果不是,則必須重新啟動轉換過程。
四 、OLAP 和 OLTP
OLAP(聯機分析處理)和 OLTP(聯機事務處理)都是允許與數據進行有效交互的兩種數據處理系統,盡管它們都是為了滿足特定且互補的需求而設計的,我們將在下面看到。
一方面,OLAP 是一種專注于快速高效分析大量數據的數據處理系統。它是一種旨在對多維數據集執行復雜查詢的技術,這些數據集可能已從不同來源合并和/或聚合,并使用優化的存儲和處理技術來確??焖夙憫獣r間。
它還提供進行比較分析、預測、趨勢和分段分析的能力,并提供交互式工具來快速、不同粒度地探索數據,從而能夠根據需要執行非常深入的分析(數據鉆取)或更多的摘要(匯總)形式的分析。
因此,OLAP 可用于提取有關存儲在數據倉庫中的數據的有價值的信息,這些信息可用于支持戰略決策。
另一方面,OLTP 是用于實時事務處理的數據處理系統。它是一種主要用于操作數據庫系統的技術,其中存儲各種日常交易,例如銷售、訂單、付款等。
這些系統經過優化,幾乎可以無延遲地實時支持大量交易,此外還保證這些交易的完整性和并發性,即保證所有交易都將被執行,數據庫始終保持一致并且可以并行執行多個交易。
因此,OLTP 有助于為實時交易提供可靠的環境,確??焖?、安全和一致地執行數據插入、修改和刪除操作。
圖 3. OLAP 和 OLTP
在以下示例中,我們可以看到 OLAP 和 OLTP 查詢之間的區別。OLAP 查詢通常用于分析目的,例如獲取每月銷售總額,而 OLTP 查詢則側重于單個記錄和實時更新,例如銷售后的庫存縮水。
# OLAP 查詢:按月分析銷售額
olap_query = """
SELECT month, SUM(total_sale)
FROM sales_table
GROUP BY month;
"""
# OLTP 查詢:庫存更新
oltp_query = """
UPDATE inventory_table
SET amount = amount - 1
WHERE product_id = 'product_to_sell';
"""
五 、ETL/ELT
為了從數據中獲取價值,必須根據需要對數據進行處理和調整。這通常涉及實施強大的流程來集成和處理數據,以便組織能夠將原始數據轉換為可操作且有價值的信息,從而有助于支持決策。
ETL 和 ELT 都是允許我們對數據進行處理的方法,但是,這兩種方法之間的關鍵區別在于操作數據的操作的執行順序。 ETL 方法按順序對數據執行以下操作:
1提?。‥).:提取階段包括從不同來源獲取數據,這些來源可以是數據庫、應用程序、文件系統等。在此階段,數據是原始的,即它們沒有經過任何類型的處理,它們只是被存儲了。
2轉換(T).:轉換階段是對先前提取的數據執行所有必要的操作,以獲得高質量且連貫的數據層。操作可能包括清理錯誤或重復的數據、格式轉換、聚合等。
3.加載 (L):加載階段包括加載已轉換為數據庫表或其他類型數據存儲(如數據倉庫)的所有數據。在此階段進行數據結構化,并針對分析和后續查詢進行優化。
對于 ELT 來說,操作順序有所不同:
1.提?。‥):從各種來源提取數據,如 ETL。
2加載(L).:數據不經轉換直接存儲。
3.轉換(T):對存儲的數據執行轉換,可能涉及使用數據分析工具、復雜的 SQL 查詢或高級分析過程。
圖 4. ETL 和 ELT 工作流程
正如我們所見,ETL 和 ELT 是類似的方法,但它們在執行轉換的時間和方式上有所不同。讓我們看看它們的一些優點和缺點:
表 2.ETL 與 ELT
根據這些方法的性質,我們可以說 ETL 用于數據倉庫,因為數據在加載之前進行轉換以保持一致性和完整性,而 ELT 用于數據湖是有意義的,因為數據以原始形式存儲并根據需要進行轉換。
現在我們了解了這兩種方法,讓我們看一個可以說明根本區別的 Python 示例。
將pandas導入為pd
## ETL
# 步驟 1:提取數據
raw_data = pd.read_csv( 'sales_data.csv' )
# 步驟 2:轉換數據
raw_data[ 'Date' ] = pd.to_datetime(raw_data[ 'Date' ])
perceived_data = raw_data.groupby(raw_data[ 'Date' ].dt.month). sum ()
# 步驟 3:加載數據
perceived_data.to_csv( 'sales_per_month.csv' )
import pandas as pd
## ELT
# 步驟 1:提取數據
raw_data = pd.read_csv( 'sales_data.csv' )
# 步驟 2:加載數據
data_lake = raw_data.copy() # 模擬數據湖,存儲原始數據
# 步驟 3:轉換數據(在數據倉庫中)
data_lake[ 'Date' ] = pd.to_datetime(data_lake[ 'Date' ])
perceived_data = data_lake.groupby(data_lake[ 'Date' ].dt.month). sum ()
結論
在本文中,我們回顧了數據管理的基礎知識,從結構化數據和非結構化數據的區別到數據倉庫和數據湖等技術及其最佳實踐。此外,我們還強調了 OLAP 和 OLTP 之間的區別,以及 ETL/ELT 流程的相關性和代碼示例或應用這些知識的用例。