資料預處理利器 Amazon Glue DataBrew

亞馬遜雲開發者發表於2022-05-31

前言

在日常業務中,我們通常使用關係型資料庫來儲存資料,供應用程式使用。

資料庫按表、行來儲存資料的方式常常造成不同敏感程度的資料被混合在一起,但在做資料統計時,我們需要更細粒度地去區分不同資料的許可權,避免造成敏感資料洩露。

以證券交易所為例,不同部門可能會有不同的資料訪問需求。

  • 財務部門,需要對本日的交易額和手續費進行彙總
  • 合規部門,需要對特定地區的交易進行審計
  • 資料部門,需要使用脫敏資料進行應用研發

這些需求很難通過在資料表上設定許可權來實現。它們有的需要做欄位級的訪問控制,有的需要對特定內容進行限制,也有的需要對欄位做一些遮罩處理。

面對這個需求,我們可以使用傳統的 ETL 手段和工具來處理,也可以使用無伺服器的 Amazon Glue DataBrew 來實現。今天,我們來介紹一下 Amazon Glue DataBrew 的基本用法和常見使用場景。

Amazon Glue DataBrew 簡介

Amazon Glue DataBrew(下簡稱「DataBrew」) 是一個無伺服器的、視覺化的資料預處理和 ETL 工具。它提供了一個視覺化編輯介面,讓使用者可以分析資料形態資料,並對資料進行處理操作,預覽效果。它提供了 200 多項操作和函式,可以滿足大部分基本資料處理需求。

核心概念

這次我們主要講解資料處理,其中涉及的核心概念有下面幾個。

  • 資料集(Dataset),即原始資料加上與之對應的後設資料
  • 專案(Project),就是基於 Web 的視覺化資料編輯器
  • 處置方案(Recipe),即對資料進行一系列處理,比如去除空欄位、轉換資料型別等等

接下來,我們就來進行第一步:資料集的建立。

建立資料集

這次我們使用紐約市計程車行程開放資料(NYC-TLC)作為示範。

1、建立本地 S3 桶

因為有區域限制,所以 NYC-TLC 的資料無法在 DataBrew 中直接使用。要使用這個資料,我們必須先自己建立一個 S3 桶,再把其中一部分資料複製過來。

image.png

2、複製到本地 S3 桶

安裝亞馬遜雲科技命令列工具後,我們可以使用如下命令將桶複製到我們自己的桶。因為 S3 桶名為全域性唯一,所以請注意把下面的 my-nyc-tlc 換成你實際建立的桶名。

aws s3 cp s3://nyc-tlc/trip+data/fhvhv_tripdata_2020-12.csv s3://my-nyc-tlc

3、連線資料集

接下來,我們可以到 DataBrew 的「資料集」(Datasets)介面,選擇「連線到新資料集」。

image.png

可以看到,DataBrew 支援的資料來源還是很多的,除了常見的直連 S3,也可以通過 JDBC 連線資料庫。如果資料本身已經在資料湖裡,經由爬蟲錄入到了 Glue Data Catalog,我們也可以直接選擇。

為了簡便,在這次演示裡,我們選擇前面建立的 S3 桶和複製過來的 .csv 檔案。資料格式選擇 CSV。

資料形態分析

建立資料集後,我們可以快速地預覽資料集中的資料。

image.png

如果想詳細瞭解資料形態,比如值的分佈、值的區間、極值、平均值、有效值等,我們可以點選右上角的「分析資料形態」(Run data profie)按鈕,建立一個「資料形態分析任務」。

建立時我們可以選擇是進行取樣分析還是全量分析,並且配置一些引數,比如:是否分析重複的行,是否分析不同欄位的相關性等。

點選「建立並執行」,資料形態分析任務就開始執行,稍後我們就能在「資料形態概覽」標籤下看到類似如下的結果。

image.png

圖左邊可以看到整體的資料量,有效值以及重複的行等等。右邊是欄位關聯表,代表欄位之間的聯動性。比如 A 欄位變化時,B 欄位如果也變化,那麼顏色就會越深。

拿第一行來說,我們可以看到橫向的 VendorID 欄位和縱向的 extra 欄位是有強烈關聯的,並且 VendorID 值越大,extra 值就越小。

假設 extra 代表的是小費,那麼我們可以說 VendorID 越小的公司,乘客給的小費就越多。這可能是因為 VendorID 小的公司使用的是比較高階的計程車。此外,我們也可以看到乘客數量、上下車地點,甚至支付方式,都和 extra 有一些關聯關係。

通過這個關聯關係圖,我們可以快速判斷哪些欄位是我們感興趣想要深入分析的。滑鼠指向任意一個格子,可以看到格子的原始值,方便細化判斷。

當然,我們也很容易就會注意到藍色格子組成的斜線,不言而喻,這是因為任何欄位都和自身是完全聯動的。

image.png

這個報告很清晰易懂,此處我只簡單介紹下部分術語:

  • Valid 代表欄位值符合 DataBrew 的推斷或者後設資料中的定義
  • Distinct 代表這個欄位有多少個獨特值(和其他值都不同)
  • Unique 代表這個欄位有多少個唯一值(只出現過 1 次)
  • Median 是中位數,即按大小排序後,處在正中間的值
  • Mean 是平均值
  • Mode 是模數,即出現次數最多的值

此外,在直方圖上,黑色代表是超出資料方差的極值。因為這部分值的數量較少,如果按比例展示可能就看不到或者看不清了,所以通常會把他的比例進行放大,用黑色區分,代表這部分的值和藍色部分的值不成正常比例。

注:目前 DataBrew 僅支援字串和數字型別的資料形態分析,如果某個欄位的內容是類似 2021-10-10 這樣的日期或時間,則這個欄位不會納入分析。要解決這個問題,我們可以對資料進行處理,給這個欄位增加一個字首(比如 DT-)或者修改這個欄位的型別。

資料處理

資料形態看得差不多,接下來我們來處理資料。

DataBrew 為我們提供了一個資料處理的視覺化編輯介面。這個介面在 DataBrew 中稱作一個「專案」,所以我們首先要建立一個專案。直接在資料集介面右上角點選「為此資料集建立專案」(Create a project with this dataset)即可建立專案。

image.png

此處,必須輸入的引數是專案名、資料集和 IAM 角色。角色可交由 DataBrew 自動建立,用於訪問資料來源,也就是 S3 桶。

建立完成後,我們會看到這樣的一個載入介面。這個介面會持續數分鐘,因為它需要分配底層計算例項,安裝編輯器應用,配置許可權等等。

image.png

數分鐘後,我們就能看到完整的編輯器,上面一排圖示就是我們能做的操作。這些操作分類如下:

  • Filter 過濾,即去掉包含非法值、缺失值的行等
  • Column 列級處理,即刪除欄位,修改欄位型別等
  • Format 值格式化,比如字串大小寫轉換,數字的小數點精確度等
  • Clean 值清理,比如刪除首尾的引號、空格,新增前字尾等
  • Extract 值提取,比如提取日期中的年月日等
  • Missing 缺失值處理,比如值缺失時填入指定值,填入平均值等
  • Invalid、Duplicates、Outliers 對應非法制、重複值和異常值,邏輯和缺失值類似
  • Split、Merge 分別是拆分和合並,即按分隔符把一個字串欄位拆分成多個欄位,或者反之
  • Create 是根據一個欄位的值生成另一個欄位,通常用於生成標籤欄位
  • Functions 是對某個欄位使用函式生成另一個欄位
  • Condition 和 Create 類似,也是按條件生成新欄位
  • Nest-Unnest 指的是把多個欄位合併成單個陣列、物件欄位,或者反之
  • Pivot 指的是維度替換,比如原來有兩個欄位「車牌號」和「上車地點」,現在每個車牌號會變成一個欄位名字,然後對應的上車地點則會變成一個列表值放在車牌號欄位下
  • Group、Join 和 Union,就類似 SQL 的 GROUP BY、JOIN 和 UNION
  • Text 是對文字處理,比如令牌化
  • Scale 是數字值規整化,比如正規化
  • Mapping 也是根據欄位值建立新的欄位,和前面的 Condition 類似,可以視作是一個快捷方式
  • Encode 是對資料進行常見的編碼,比如機器學習常見的「單熱編碼」(One-hot encoding)
  • Sensitve 是對敏感和隱私資料的處理,比如遮罩、加解密等

接下來,我們來看幾個常見的資料處理場景。

注:請注意 DataBrew 的專案(編輯器)與很多 AWS 不同,不是按秒而是最少收取半小時的費用。

1、列級過濾 – 限制訪問資料型別

假設現在某個財務或者稅務部門的分析師,希望能分析統計下面這些資訊。

  • 不同計程車資訊供應商旗下的汽車的交易額
  • 不同日期的計程車交易額
  • 主要的支付方式
  • 月度計程車交易總額

這時候,我們就可以只顯示相關的欄位,而把其他的欄位給過濾掉。要做欄位過濾,我們可以使用 DataBrew 的 Column > Delete 操作。這個操作會刪除指定的欄位,只保留允許使用者檢視的欄位。

2、行級過濾 – 只保留特定語義的資料

幾乎所有資料工具都支援表級別的過濾,部分工具也支援欄位過濾,但支援行級過濾的要少一些。行級過濾意味著我們可以對資料的語義做判斷,並且只允許使用者檢視部分型別的資料。

比如下面這個需求。

  • 只允許分析機場區域和 CDB 商圈之間的計程車記錄
  • 只允許分析夜間的計程車記錄
  • 只允許分析金額小於 100 元的記錄

要做到行級過濾,我們可以使用 Filter > By condition 操作,這個操作支援對數字和字串做簡單對比,然後進行過濾。

如果某些欄位不能直接滿足對比要求,那麼我們可以按條件把值先提取到另一個欄位,再對新的欄位做條件處理。比如「是否夜間」這個比較難直接判斷,那麼我們就可以先使用 Functions > Date functions > HOUR 函式把小時資訊提取到新欄位,然後再針對這個欄位進行過濾。

3、其他處理

除了行級和列級過濾,DataBrew 也可以做很多別的資料處理,下面簡單介紹幾個場景。

敏感資料處理

為保護使用者隱私,我們可以把敏感資料進行加密。

目前 DataBrew 支援兩種加密方式,一種是「確定性加密」(Deterministic Encryption),另一種是「非確定性加密」(Probablistic Encryption)。

前者適合加密一些不需要參與運算,但是需要以確定值參與統計,並且最後還需要還原的欄位。比如:計程車的車牌或者乘客上下車的地點。

後者則適合加密一些不需要參與運算,也不需要參與統計,但是在特定時刻,有特定許可權的人還是需要將其還原的資料。比如:人名,身份證號等個人相關資訊。

如果只需要統計,不需要還原,則可以選擇對該欄位直接進行雜湊處理,或者將該欄位的部分值進行遮罩(比如替換成「#」)。

函式呼叫

DataBrew 內建了非常多的函式,這些函式和我們常見的 Excel 函式類似,可以幫助我們快速地對資料進行處理。常用的函式有:

  • 數學函式:取整、取絕對值等
  • 文字函式:大小寫轉換、取部分文字、替換文字等
  • 日期函式:取年月日、取日期差等
  • 視窗函式:取某個時間視窗的總數、最大最小值等
  • Web 函式:IP 與整數值互轉、URL 的請求字串提取等

條件處理

DataBrew 支援使用 IF 或者 CASE,根據欄位值的不同,輸出指定的值到一個新的列。

這個處理方式適合在沒有現成的函式可用時,手動、精細地對某個欄位進行處理或標記。比如:把使用者的生日轉換成屬相或者星座。

此外,條件處理還支援日期格式,並且支援以其他欄位的值作為輸入,形成類似變成語言的 FOR 迴圈效果,這可以幫助使用者實現複雜的資料處理邏輯。

建立資料處理任務

在專案中,我們可以對資料做處理並且預覽效果,但此時的處理僅針對取樣的資料,實際資料仍然沒有處理。預覽效果覺得處理無誤後,我們就可以建立資料處理任務,從而對全量資料進行處理。

在專案的右上角,點選「建立任務」。接下來,我們需要輸入:

  • 目標 S3 桶
  • 資料格式,比如:CSV、Parquet 等
  • 執行週期,比如:一次性、定時重複執行等
  • 執行角色,這個角色需要能訪問源桶和目標桶

這些資訊輸入完成後,我們可以選擇「建立並執行」,直接執行這個任務。

資料血緣

DataBrew 為每個專案提供了簡易的資料血緣圖(Linage)。在資料血緣圖中,我們可以看到針對這個專案,我們的原始資料在哪個 S3 桶,這個桶對應了哪個資料集,對應這個資料集的專案是什麼,這個專案對資料進行了哪些處理,然後輸出到了哪裡。

image.png

需要注意的是,目前 DataBrew 的血緣僅展示當前的 DataBrew 專案中資料的流向。

總結

隨著大資料系統的建設和技術發展,資料湖中的資料越來越多,越來越實時。為了合規、合法,資料持有者必須高度重視訪問控制。

資料湖工具通常也會提供許可權控制,但粒度通常只能到表級別,如果要到行級別或者列級別,則需要額外在本地安裝工具,而且有被繞過的風險。不同部門和訪問許可權的人使用不同的 S3 桶,並且使用只包含特定業務需要的資料檔案,可以很大程度上降低資料洩露的風險。

對於探索期的專案,許可權的管理可能比較粗放,但是在業務穩定開始長期執行時,我們應該考慮把這些流程固化下來,讓使用者和部門只能訪問到自己能訪問並且需要訪問的資料。

作為一個無伺服器的資料處理服務,DataBrew 非常適合資料科學家、業務專家等對業務熟悉但對底層技術研究不深的使用者,以及資料合規探索期的團隊。使用 Amazon Glue DataBrew 我們可以快速搭建起一套彈性的資料處理流水線,把更多的精力放在業務上。

對 Amazon Glue DataBrew 的簡單介紹就到這裡,希望對讀者有所幫助。

本篇作者

image.png

張玳

亞馬遜雲科技解決方案架構師

十餘年企業軟體研發、設計和諮詢經驗,專注企業業務與亞馬遜雲科技服務的有機結合。譯有《軟體之道》《精益創業實戰》《精益設計》《網際網路思維的企業》,著有《體驗設計白書》等書籍。

相關文章