用户画像之数据质量管理
数据质量管理这项工作的重要性不言而喻,所谓“garbage in,garbage out”,基础数据的质量性如果无法得到良好保障,后续的推荐、数据分析工作将会变得徒劳。
背景
在建好用户画像模型后,该数据模型成为了一个个落在数据仓库的表,数据仓库的开发人员通过通过调度任务,每天定时从各业务数据表和日志数据表抽取用户行为数据加工到用户画像相关表中。各种类型的标签每天加工的数据成百上千万条,数据分析人员不会每天对这些数据的质量进行核查,去发现每类标签的数量是否有异常情况,但是当应用的过程中使用异常数据将会导致分析结论的误差,那么如何高速、有效地对用户画像数据的质量进行管理?
方法
数据运营人员可以通过设定画像各业务表数据监控范围,当每天跑ETL出现异常变动时,通过统计每类标签的总量变动较大时,发送邮件让数据运营的人员接收,然后查找原因进行定位。
下面分享一下某个对用户画像数据管理的python脚本:
# -*- coding: utf-8 -*- impala_01 = ''' 删除临时表语句''' impala_02 = ''' 创建临时表,检查昨日运行产生的各类用户标签数量是否在合理范围内 ''' # 建表语句 impala_03 = '''查询impala_02语句创建的临时表中的数据量''' import smtplib import os import datetime from impala.dbapi import connect from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.header import Header from email.mime.image import MIMEImage import pyhs2 impala_conn = pyhs2.connect(host='10.21.190.220', port=10086, authMechanism="PLAIN", user='zhaoht', password='yourpassword', database='wedw_dw') impala_cur = impala_conn.cursor() impala_cur.execute(impala_01) # 执行删除临时表的SQL impala_cur.execute(impala_02) # 执行创建临时表的SQL try: impala_cur.execute(impala_03) result_1 = impala_cur.fetchall() data_1 = list(result_1[0]) # 将元组数据列表化 data_1 = int(data_1.pop()) # 将列表数据转化为整数 except Exception: data_1 = 1 impala_cur.close() impala_conn.close() sumdata = data_1 # 各标签加总为0正常 if sumdata == 0 : # 如果各标签的数据量正常 则不用发送邮件 pass else: # 当标签数据量出现异常时 自动发送邮件 pwd = 'yourpassword' sender_mail = '[email protected]' receiver = '[email protected]' mail_content = ''' 用户画像维护人员你好,gdw.persona_user_tag_relation_public表中昨日数据发生异常,各类标签数据统计如下:A类标签[3000000-3500000]:{} '''.format(data_1) mail_title = '用户个性化标签表异常数据预警邮件' date_str = datetime.datetime.strftime(datetime.date.today()-datetime.timedelta(days=1),'%m%d') msgRoot = MIMEMultipart('mixed') #实例化一个类 msgRoot['Subject'] = Header(mail_title, 'utf-8') msgRoot['From'] = sender_mail msgRoot['To'] = receiver msgRoot["Accept-Language"]="zh-CN" msgRoot["Accept-Charset"]="ISO-8859-1,utf-8" content = MIMEText(mail_content,'plain','utf-8') msgRoot.attach(content) smtp = smtplib.SMTP() smtp.set_debuglevel(1) smtp.connect('mail.guahao.com') smtp.login(sender_mail, pwd) #登录发件人邮箱 smtp.sendmail(sender_mail, receiver, msgRoot.as_string()) smtp.quit()
上面的python脚本通过执行HQL语句创建临时表统计前一日某类用户画像标签所产生的数据,通过统计每一类标签数据量与其正常的合理范围做比对,当发现异常情况时,发送预警邮件到数据管理人员的邮箱,当其数值在合理范围内时,则不发送邮件。在完成上面的python预警脚本后,还需要将该脚本部署到服务器上,通过crontab定时调度命令,每天定时检索昨日运营产生的用户画像标签数量,当发生异常情况时及时收到预警邮件(如下图),数据管理人员可在第一时间对问题原因进行排查和定位。
总结
用户画像不“生产”数据,它只是各业务数据、日志数据、埋点数据的“搬运工”。通常当用户画像相关表中出现了脏数据、异常数量级的数据时,一般是其从上游抽取数据的依赖表中出现了异常。上图中可以看到,当用户标签表在2017年11月11日运行产生的数据量不在合理范围内时,画像管理人员的邮件在11月12日的9:53分收到了一封异常数据的预警邮件(数据仓库隔日加工前一天的数据)。管理人员可以根据异常数量的标签对应类型,进一步查找其上游依赖表定位问题原因。