前言
在日常業務中,我們通常使用關係型資料庫來儲存資料,供應用程式使用。
資料庫按表、行來儲存資料的方式常常造成不同敏感程度的資料被混合在一起,但在做資料統計時,我們需要更細粒度地去區分不同資料的許可權,避免造成敏感資料洩露。
以證券交易所為例,不同部門可能會有不同的資料訪問需求。
- 財務部門,需要對本日的交易額和手續費進行彙總
- 合規部門,需要對特定地區的交易進行審計
- 資料部門,需要使用脫敏資料進行應用研發
這些需求很難通過在資料表上設定許可權來實現。它們有的需要做欄位級的訪問控制,有的需要對特定內容進行限制,也有的需要對欄位做一些遮罩處理。
面對這個需求,我們可以使用傳統的 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 桶,再把其中一部分資料複製過來。
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)介面,選擇「連線到新資料集」。
可以看到,DataBrew 支援的資料來源還是很多的,除了常見的直連 S3,也可以通過 JDBC 連線資料庫。如果資料本身已經在資料湖裡,經由爬蟲錄入到了 Glue Data Catalog,我們也可以直接選擇。
為了簡便,在這次演示裡,我們選擇前面建立的 S3 桶和複製過來的 .csv 檔案。資料格式選擇 CSV。
資料形態分析
建立資料集後,我們可以快速地預覽資料集中的資料。
如果想詳細瞭解資料形態,比如值的分佈、值的區間、極值、平均值、有效值等,我們可以點選右上角的「分析資料形態」(Run data profie)按鈕,建立一個「資料形態分析任務」。
建立時我們可以選擇是進行取樣分析還是全量分析,並且配置一些引數,比如:是否分析重複的行,是否分析不同欄位的相關性等。
點選「建立並執行」,資料形態分析任務就開始執行,稍後我們就能在「資料形態概覽」標籤下看到類似如下的結果。
圖左邊可以看到整體的資料量,有效值以及重複的行等等。右邊是欄位關聯表,代表欄位之間的聯動性。比如 A 欄位變化時,B 欄位如果也變化,那麼顏色就會越深。
拿第一行來說,我們可以看到橫向的 VendorID 欄位和縱向的 extra 欄位是有強烈關聯的,並且 VendorID 值越大,extra 值就越小。
假設 extra 代表的是小費,那麼我們可以說 VendorID 越小的公司,乘客給的小費就越多。這可能是因為 VendorID 小的公司使用的是比較高階的計程車。此外,我們也可以看到乘客數量、上下車地點,甚至支付方式,都和 extra 有一些關聯關係。
通過這個關聯關係圖,我們可以快速判斷哪些欄位是我們感興趣想要深入分析的。滑鼠指向任意一個格子,可以看到格子的原始值,方便細化判斷。
當然,我們也很容易就會注意到藍色格子組成的斜線,不言而喻,這是因為任何欄位都和自身是完全聯動的。
這個報告很清晰易懂,此處我只簡單介紹下部分術語:
- Valid 代表欄位值符合 DataBrew 的推斷或者後設資料中的定義
- Distinct 代表這個欄位有多少個獨特值(和其他值都不同)
- Unique 代表這個欄位有多少個唯一值(只出現過 1 次)
- Median 是中位數,即按大小排序後,處在正中間的值
- Mean 是平均值
- Mode 是模數,即出現次數最多的值
此外,在直方圖上,黑色代表是超出資料方差的極值。因為這部分值的數量較少,如果按比例展示可能就看不到或者看不清了,所以通常會把他的比例進行放大,用黑色區分,代表這部分的值和藍色部分的值不成正常比例。
注:目前 DataBrew 僅支援字串和數字型別的資料形態分析,如果某個欄位的內容是類似 2021-10-10 這樣的日期或時間,則這個欄位不會納入分析。要解決這個問題,我們可以對資料進行處理,給這個欄位增加一個字首(比如 DT-)或者修改這個欄位的型別。
資料處理
資料形態看得差不多,接下來我們來處理資料。
DataBrew 為我們提供了一個資料處理的視覺化編輯介面。這個介面在 DataBrew 中稱作一個「專案」,所以我們首先要建立一個專案。直接在資料集介面右上角點選「為此資料集建立專案」(Create a project with this dataset)即可建立專案。
此處,必須輸入的引數是專案名、資料集和 IAM 角色。角色可交由 DataBrew 自動建立,用於訪問資料來源,也就是 S3 桶。
建立完成後,我們會看到這樣的一個載入介面。這個介面會持續數分鐘,因為它需要分配底層計算例項,安裝編輯器應用,配置許可權等等。
數分鐘後,我們就能看到完整的編輯器,上面一排圖示就是我們能做的操作。這些操作分類如下:
- 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 桶,這個桶對應了哪個資料集,對應這個資料集的專案是什麼,這個專案對資料進行了哪些處理,然後輸出到了哪裡。
需要注意的是,目前 DataBrew 的血緣僅展示當前的 DataBrew 專案中資料的流向。
總結
隨著大資料系統的建設和技術發展,資料湖中的資料越來越多,越來越實時。為了合規、合法,資料持有者必須高度重視訪問控制。
資料湖工具通常也會提供許可權控制,但粒度通常只能到表級別,如果要到行級別或者列級別,則需要額外在本地安裝工具,而且有被繞過的風險。不同部門和訪問許可權的人使用不同的 S3 桶,並且使用只包含特定業務需要的資料檔案,可以很大程度上降低資料洩露的風險。
對於探索期的專案,許可權的管理可能比較粗放,但是在業務穩定開始長期執行時,我們應該考慮把這些流程固化下來,讓使用者和部門只能訪問到自己能訪問並且需要訪問的資料。
作為一個無伺服器的資料處理服務,DataBrew 非常適合資料科學家、業務專家等對業務熟悉但對底層技術研究不深的使用者,以及資料合規探索期的團隊。使用 Amazon Glue DataBrew 我們可以快速搭建起一套彈性的資料處理流水線,把更多的精力放在業務上。
對 Amazon Glue DataBrew 的簡單介紹就到這裡,希望對讀者有所幫助。
本篇作者
張玳
亞馬遜雲科技解決方案架構師
十餘年企業軟體研發、設計和諮詢經驗,專注企業業務與亞馬遜雲科技服務的有機結合。譯有《軟體之道》《精益創業實戰》《精益設計》《網際網路思維的企業》,著有《體驗設計白書》等書籍。