亚马逊AWS官方博客
使用 Amazon Glue DataBrew 对数据进行预处理
在日常业务中,我们通常使用关系型数据库来存储数据,供应用程序使用。
数据库按表、行来存储数据的方式常常造成不同敏感程度的数据被混合在一起,但在做数据统计时,我们需要更细粒度地去区分不同数据的权限,避免造成敏感数据泄露。
以证券交易所为例,不同部门可能会有不同的数据访问需求。
- 财务部门,需要对本日的交易额和手续费进行汇总
- 合规部门,需要对特定地区的交易进行审计
- 数据部门,需要使用脱敏数据进行应用研发
这些需求很难通过在数据表上设定权限来实现。它们有的需要做字段级的访问控制,有的需要对特定内容进行限制,也有的需要对字段做一些遮罩处理。
面对这个需求,我们可以使用传统的 ETL 手段和工具来处理,也可以使用无服务器的 Amazon Glue DataBrew 来实现。今天,我们来介绍一下 Glue DataBrew 的基本用法和常见使用场景。
Glue DataBrew 简介
Glue DataBrew(下简称「DataBrew」) 是一个无服务器的、可视化的数据预处理和 ETL 工具。它提供了一个可视化编辑界面,让用户可以分析数据形态数据,并对数据进行处理操作,预览效果。它提供了 200 多项操作和函数,可以满足大部分基本数据处理需求。
核心概念
这次我们主要讲解数据处理,其中涉及的核心概念有下面几个。
- 数据集(Dataset),即原始数据加上与之对应的元数据
- 项目(Project),就是基于 Web 的可视化数据编辑器
- 处置方案(Recipe),即对数据进行一系列处理,比如去除空字段、转换数据类型等等
接下来,我们就来进行第一步:数据集的创建。
创建数据集
这次我们使用纽约市出租车行程开放数据(NYC-TLC)作为示范。
创建本地 S3 桶
因为有区域限制,所以 NYC-TLC 的数据无法在 DataBrew 中直接使用。要使用这个数据,我们必须先自己创建一个 S3 桶,再把其中一部分数据复制过来。
复制到本地 S3 桶
安装 AWS 命令行工具后,我们可以使用如下命令将桶复制到我们自己的桶。因为 S3 桶名为全局唯一,所以请注意把下面的 my-nyc-tlc 换成你实际创建的桶名。
aws s3 cp s3://nyc-tlc/trip+data/fhvhv_tripdata_2020-12.csv s3://my-nyc-tlc
连接数据集
接下来,我们可以到 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 不同,不是按秒而是最少收取半小时的费用。
列级过滤 – 限制访问数据类型
假设现在某个财务或者税务部门的分析师,希望能分析统计下面这些信息。
- 不同出租车信息供应商旗下的汽车的交易额
- 不同日期的出租车交易额
- 主要的支付方式
- 月度出租车交易总额
这时候,我们就可以只显示相关的字段,而把其他的字段给过滤掉。要做字段过滤,我们可以使用 DataBrew 的 Column > Delete 操作。这个操作会删除指定的字段,只保留允许用户查看的字段。
行级过滤 – 只保留特定语义的数据
几乎所有数据工具都支持表级别的过滤,部分工具也支持字段过滤,但支持行级过滤的要少一些。行级过滤意味着我们可以对数据的语义做判断,并且只允许用户查看部分类型的数据。
比如下面这个需求。
- 只允许分析机场区域和 CDB 商圈之间的出租车记录
- 只允许分析夜间的出租车记录
- 只允许分析金额小于 100 元的记录
要做到行级过滤,我们可以使用 Filter > By condition 操作,这个操作支持对数字和字符串做简单对比,然后进行过滤。
如果某些字段不能直接满足对比要求,那么我们可以按条件把值先提取到另一个字段,再对新的字段做条件处理。比如「是否夜间」这个比较难直接判断,那么我们就可以先使用 Functions > Date functions > HOUR 函数把小时信息提取到新字段,然后再针对这个字段进行过滤。
其他处理
除了行级和列级过滤,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 非常适合数据科学家、业务专家等对业务熟悉但对底层技术研究不深的用户,以及数据合规探索期的团队。使用 DataBrew 我们可以快速搭建起一套弹性的数据处理流水线,把更多的精力放在业务上。
对 DataBrew 的简单介绍就到这里,希望对读者有所帮助。