
数据探查是数据质量保障非常重要的一步,它是数据开发的基础,如果没有数据探查,数据类项目就会频繁反复,对项目开发,运维带来很大困难,大幅延长项目周期。本篇将介绍对于数据探查常见问题,目前字节跳动提供的动态探查解决方案、应用场景以及技术实现。

文 | 小哲 来自字节跳动数据平台开发套件团队
需求背景
-
无法看到探查的数据明细以及关联的行详情,无法对数据进行预处理操作。 -
探查还是需要资源调度,等待时长平均分钟级。 -
与质量监控没有打通,探查数据的后续走向不明确。
-
基于大数据预览的探查,支持对数据进行函数级别的预处理。 -
探查结果秒级更新,实时响应。 -
与数据监控打通,探索SQL的生成模式。

应用场景
-
元数据管理 -> 探查 -> 数据预览探查(库表的质量报告) -
数据监控 <-> 数据探查 -
动态探查 -> SQL -> 数据开发 -> 调试 -> 探查报告(质量分析)

名词解释
全量探查: 基于库表的全量探查,后端引擎执行,展示探查后列的统计分布结果。 动态探查: 基于抽样的部分数据探查,展示字段明细,可以使用操作对数据进行预处理,并实时动态的展示统计分布结果。数据获取后的过程都由前端执行。

技术实现
技术架构

-
抽样能力:对数据进行基于质量分布特征的抽取。
-
数据展现:大容量的数据载体,支持对数据处理的实时展现。
-
前端探查:实时探查,可视化展现数据分布,突出质量指标。
-
数据处理能力:函数处理能力(GroupBy..)
-
操作栈:需要对数据操作进行管理和回溯
-
编辑器:提供完整函数的功能,需要:词法解析,智能提醒,语法高亮。
-
生成SQL:将可视化的交互式操作转换成可执行的SQL。
-
基于链式调用生成
-
基于标签模板生成 -
基于AST(抽象语法树)去做
关键技术及实现
大数据渲染
卡片联动

// 计算卡片中点坐标 index是卡片序号,adsorbSider表示是否吸边getCardCenter(index: number, adsorbSider?: boolean) {...// 获取卡片信息const cardBox: IBaseBox = this.cardList[index];// 获取列信息const colBox: IBaseBox = this.colList[index];const clientWidth = getClientWidth();if(adsorbSider) {// 吸边处理if(cardBox.offset < this.cardScroll) {return cardBox.offset;}if(cardBox.offset + cardBox.width - this.cardScroll > clientWidth) {return cardBox.offset + cardBox.width - clientWidth;}return this.cardScroll;}return getTargetPosition(colBox, this.tableScroll, cardBox);}// 获取滚动目标位置// originBox: 滚动起始对象// originScroll: 滚动起始左侧scroll// targetBox: 滚动结束对象const getTargetPosition = (originBox: IBaseBox, originScroll: number, targetBox: IBaseBox) => {const clientWidth = getClientWidth();if(!originBox || !targetBox) return 0;let offsetLeftSider = Math.max(originBox?.offset - originScroll, 0);if(offsetLeftSider + targetBox.width >= clientWidth) {if(targetBox.offset + targetBox.width > clientWidth) {// 此处容易出现吸边return targetBox.offset + targetBox.width - clientWidth;} else {return 0;}}const scroll = targetBox?.offset - offsetLeftSider + (targetBox.width - originBox.width) / 2;return Math.max(Math.min(targetBox.offset, scroll),0);}
居中对齐是对于卡片和列宽在scroll距离允许情况下的理想对齐方式,贴边对齐是针对卡片在起始和结束位置scroll不足以满足居中对齐要求时候的对齐方式,除此之外还有一种是卡片的宽度远大于列宽,并且不是起始或者结束位置的时候所采取的对齐方式,如下如卡片B因为无法滚动,卡片A的宽度又占据了底部第二列的一部分,所以此时卡片B只能高亮和底部的列进行对齐。

操作栈

-
如何管理多种操作进行串行计算
Input + Logic = Ouput的结构,Input是输入参数,此处可以是指某一列的数据、上一步操作的结果或者其他计算值,Logic是操作的具体逻辑,负责根据Input转换生成Output,Output可以作为最终结果进行渲染,也可以再次进入下一环节参与计算,拿列删除操作举个栗子,下面是大体代码实现:
class ColDelOpt {run = (params: IOptEngineMetaInfo) => {// 操作Input部分const {columns = [],dataSourceMap = {}} = params;const {fields = []} = this.params;// 操作Logic部分const nextColumns = columns.filter((item) => !fields.includes(item.name));// 操作的Outputreturn {columns: nextColumns,dataSourceMap}}}
-
某个操作被修改后如何进行二次计算

// 操作引擎class OptEngine {// 操作列表private optList: IOptEngineItem[] = [];// 原始数据private metaData: IOptEngineMetaInfo = {columns: [],dataSourceMap: {},};// 执行算子optRun = () => {let {columns = [],dataSourceMap = {}} = this.metaData;if(!this.optList.length) return {columns,dataSourceMap};for(let index = 0; index < this.optList.length; index++) {// 读取操作算子const optItem = this.optList[index];let startTime = performance.now();try {// 执行算子计算const result = optItem.run({columns,dataSourceMap});// 更新算子结果columns = result.columns || [];dataSourceMap = result.dataSourceMap || {};} catch(e) {// 报错后直接直接返回return {columns,dataSourceMap,// 装填报错信息errorInfo: {key: optItem.key || '',message: e.message}}}}return {columns,dataSourceMap,}}autoRun = (metaInfo: IOptEngineMetaInfo,optList: IOptItem[],callback: (params: IAutoRunResult) => void) => {// 装填数据this.setupMetaData(metaInfo);// 装填操作栈this.setupOptList(optList.map((item) => {// 行过滤if(item.type === OPT_TYPE.FILTER) {return new FilterOpt({key: item.key,params: item.params})}// 其余类型操作...// 默认原值返回return new IdentityOpt({key: item.key,})}));// 执行操作计算const result = this.optRun();// 返回数据return {// 计算列columns: result.columns,// 执行结果dataSource: Object.entries(result.dataSourceMap).map(([key, value]) => ({field: key,value})),// 操作栈执行异常信息errorInfo: result.errorInfo};}}
应用实践

后续计划
-
更多的探查类型和图表支持
-
操作栈的编辑器体验
-
操作流程的SQL生成
产品介绍
火山引擎大数据研发治理套件DataLeap
一站式数据中台套件,帮助用户快速完成数据集成、开发、运维、治理、资产、安全等全套数据中台建设,帮助数据团队有效的降低工作成本和数据维护成本、挖掘数据价值、为企业决策提供数据支撑。后台回复数字“2”了解产品。
字节跳动数据平台开发套件团队火热招人中!后台回复“招聘”,获取岗位信息。
点击阅读原文进入官网,了解DataLeap更多产品信息


