GDPR/隐私合规——用户画像怎么做数据脱敏和权限控制?
先说结论
画像合规的核心原则是「最小必要」:只收集业务必需的数据,只保留必要的时间,只给必要的人访问。不是说不能做画像,而是做画像的时候要守住底线。
技术层面要做三件事:数据分级、脱敏处理、权限控制。敏感数据(手机号、邮箱、精确位置)必须脱敏存储,访问权限按角色控制。
用户有权要求删除自己的数据。GDPR的被遗忘权要求:用户请求删除时,必须在合理时间内(通常30天)删除该用户的所有画像数据。这对技术架构有很大影响。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
隐私合规是出海业务绕不开的话题。欧洲有GDPR、美国加州有CCPA、中国有个人信息保护法——用户画像天然涉及大量个人数据,如果不做好合规,轻则罚款、重则被下架。我在某出海硬件品牌和某短剧出海公司都深度参与过合规改造。面试官问这道题,尤其看重你对合规的实际操作经验,而不只是知道GDPR这个词。
数据分级:哪些数据需要特别保护
| 敏感等级 | 数据类型 | 示例 | 脱敏要求 | 保留期限 |
|---|---|---|---|---|
| L1 - 高敏感 | 可直接识别身份的数据 | 手机号、邮箱、身份证号 | 必须加密或Hash存储 | 业务最短需要期限 |
| L2 - 中敏感 | 可间接识别身份的数据 | 设备ID、IP地址、精确GPS | 必须脱敏或模糊化 | 6-12个月 |
| L3 - 低敏感 | 行为数据和统计数据 | 点击事件、消费金额、标签值 | 可明文存储 | 按业务需要保留 |
| L4 - 无敏感 | 聚合统计数据 | DAU、转化率、群体画像 | 无需脱敏 | 长期保留 |
脱敏方案实战
-- 画像数据脱敏处理
-- 1. 手机号脱敏:只存Hash值,不存明文
SELECT
user_id,
MD5(phone_number) AS phone_hash, -- 用于ID Mapping关联
CONCAT(LEFT(phone_number,3), '****',
RIGHT(phone_number,4)) AS phone_mask, -- 用于展示:138****1234
-- 不要在画像表里存明文手机号!
FROM ods_user_register;
-- 2. IP地址模糊化:只保留前三段
SELECT
user_id,
REGEXP_REPLACE(ip_address, '(\\d+)$', '0') AS ip_masked,
-- 192.168.1.123 -> 192.168.1.0
FROM dwd_user_event;
-- 3. GPS坐标降精度:保留到城市级别
SELECT
user_id,
ROUND(latitude, 1) AS lat_city, -- 小数点1位 = 约11公里精度
ROUND(longitude, 1) AS lng_city, -- 够定位到城市,不会定位到个人
FROM dwd_user_location;
权限控制:谁能看什么数据
画像数据的访问权限必须按角色分级,不能让所有人都能看到所有标签。
| 角色 | 可访问的数据 | 不可访问的数据 | 技术实现 |
|---|---|---|---|
| 运营人员 | 标签值、分群结果、聚合统计 | 手机号、邮箱、设备ID | Hive视图 + 列级权限 |
| 数据分析师 | 全量标签 + 脱敏后的用户ID | 明文手机号、明文邮箱 | Ranger列级权限控制 |
| 数据开发 | 全量标签 + 明文数据(开发环境) | 生产环境明文数据 | 环境隔离 |
| 外部合作方 | 聚合统计数据 | 任何用户级数据 | 数据出口审批 |
-- 通过Hive视图实现列级权限控制
-- 运营看到的画像视图(脱敏版)
CREATE VIEW v_user_profile_ops AS
SELECT
MD5(user_id) AS user_id_hash, -- 脱敏的用户ID
gender, age_group, country, -- 标签值可以看
value_level, lifecycle_stage,
login_cnt_7d, total_amount_usd
-- 注意:没有phone_number, email, device_id
FROM ads_user_profile
WHERE dt = '${bizdate}';
-- 给运营角色授权这个视图,而不是授权原始表
GRANT SELECT ON v_user_profile_ops TO ROLE ops_role;
被遗忘权:用户要求删除数据怎么办
GDPR第17条规定用户有「被遗忘权」——用户可以要求删除自己的所有数据。这对画像系统的影响很大,因为用户数据散布在ODS、DWD、DWS、ADS各层,还同步到了Redis和ES。
# 用户数据删除流程
def delete_user_data(user_id):
"""
GDPR被遗忘权:删除指定用户的所有画像数据
必须在收到请求后30天内完成
"""
# 1. 记录删除请求(审计日志)
log_deletion_request(user_id, request_time=datetime.now())
# 2. 删除各层Hive数据(用INSERT OVERWRITE过滤掉该用户)
for table in ['ads_user_profile', 'dws_user_active_7d',
'dwd_user_event', 'dim_user_base']:
spark.sql(f"""
INSERT OVERWRITE TABLE {table} PARTITION (dt)
SELECT * FROM {table} WHERE user_id != '{user_id}'
""")
# 3. 删除Redis中的画像数据
redis.delete(f'user:profile:{user_id}')
redis.delete(f'user:realtime:{user_id}')
# 4. 删除ES中的数据
es.delete_by_query(index='user_profile', body={
'query': {'term': {'user_id': user_id}}})
# 5. 记录删除完成(审计日志)
log_deletion_complete(user_id, complete_time=datetime.now())
技术难点:Hive是不可变存储,删除单条数据需要INSERT OVERWRITE整个分区——代价很高。如果画像表有365天的分区,删除一个用户要重写365个分区。优化方案:①只删除最近N天的分区(比如90天),更早的分区数据已经过了保留期限会自动清理;②用Delta Lake/Iceberg做存储层,原生支持DELETE操作,不需要全分区重写。
面试高频追问
追问一:GDPR对画像系统影响最大的是什么?
影响最大的是三个方面:①合法基础——做画像必须有用户同意或合法利益作为法律依据,不能偷偷做;②数据最小化——只收集业务必需的数据,不能「先收集了以后再想用途」;③被遗忘权——用户要求删除时必须能在30天内删干净。对技术架构来说,最大的影响是被遗忘权——需要在所有存储系统中追踪和删除特定用户的数据,这要求数据血缘必须清晰。
追问二:出海业务怎么区分不同地区的合规要求?
我们的做法是按用户的注册国家/地区做合规分区。欧洲用户(GDPR覆盖的EEA国家)执行最严格的标准:明确同意才能做画像、必须支持数据导出和删除、数据存储在欧洲Region。美国用户按CCPA标准:需要提供Opt-Out选项,允许用户拒绝个人信息出售。其他地区按公司统一的隐私政策处理。技术上在画像表里加一个compliance_region字段,下游处理时按Region做差异化。
追问三:匿名化和脱敏有什么区别?
脱敏是隐藏部分信息但仍可能通过组合还原身份(比如手机号中间四位用星号代替,但前后三位+四位仍可能识别),是一种弱保护。匿名化是彻底去除所有可识别信息,无法还原身份(比如只保留聚合统计数据),是一种强保护。GDPR认为匿名化数据不受GDPR约束,但脱敏数据仍然受约束。所以聚合后的群体画像不受GDPR约束,但用户级别的画像标签即使脱敏了也受约束。
实战踩坑
我在某出海硬件品牌遇到过一次合规事件:产品团队直接把用户的精确GPS坐标存入了画像表,用于分析用户的线下活动轨迹。被欧洲的合规审计发现后,被要求在2周内修复——删除所有精确GPS数据,改为只存城市级别的模糊位置。
修复过程很痛苦:要回溯3个月的画像数据,把所有GPS字段降精度处理。因为画像表很大(千万用户 x 90天分区),全量重写花了2天时间。
教训:数据合规必须在设计阶段就考虑,不能事后补救。GPS坐标在ODS层采集时就应该降精度,不应该让明文精确坐标进入DWD和ADS层。数据一旦写入了多个系统(Hive+Redis+ES),回溯清理的成本远高于源头控制的成本。
总结
画像合规三件事:数据分级(L1高敏感到L4无敏感)、脱敏处理(Hash/掩码/模糊化)、权限控制(角色+视图+列级授权)。被遗忘权的技术实现要考虑多存储系统的数据清除。核心原则是「最小必要」——源头控制远好于事后补救。面试时能讲出合规改造的真实经历和踩坑,说明你做过的是真正面向生产的画像系统。
最后一篇来做一个收尾:用户画像项目的技术选型怎么讲?为什么选这套方案?
你们的画像系统做过合规改造吗?最大的挑战是什么?评论区聊聊~
关注「Wood聊大数据」| 9年大数据老兵,聊技术、聊职场、聊成长