数据质量监控实现

在数据生成过程中,我们通常会以脚本执行成功与否来判断数据是否生成;但是这种判断逻辑会有一个问题:只能判断是否有数据,而不能对数据质量进行监控。举个简单例子:我们有一个脚本生成每日流量数据,20190410这一天生成了100w数据,20190411这一天只有50w数据,这明显不正常,出现这种情况必须马上核查问题所在,不然依赖这份数据的所有报表都会出问题;所以数据质量监控就很有必要,怎么做?就以这个例子为例尝试解决下。先画个图,假定是数据项监控页面结构
在这里插入图片描述
我们定义一些关注的指标,例如变量dayBeforeyestodayyesterday,每个变量后面都跟一个计算值的sql;有了这些变量后,接下来就是编写表达式

Math.abs(${yesterday}-${dayBeforeyesterday})/${dayBeforeyesterday}>0.1

这个表达式采用的是javascript语法,这个表达式的含义:如果昨天的数据量和前天的数据量误差超过10%,就进行报警;问题来了,怎样在后台解析执行判断表达式?其实在java里可以使用javax.script.ScriptEngine来实现这个功能,这就是为什么表达式要用javascript语法,看代码

ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
        ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("javascript");
        String expression = "Math.abs(${yesterday}-${dayBeforeyesterday})/${dayBeforeyesterday}>0.1";
        Map<String,String> values = new HashMap<String,String>();
        values.put("dayBeforeyesterday","1000340");
        values.put("yesterday","1110340");


        Set<String> strings = values.keySet();
        for(String k:strings){
            expression = expression.replaceAll("\\$\\{"+k+"}",values.get(k));
        }

        System.out.println("表达式:"+expression);

        try {
            String result = String.valueOf(scriptEngine.eval(expression));
            System.out.println(result);
        } catch (ScriptException e) {
            e.printStackTrace();
        }

输出

表达式:Math.abs(1110340-1000340)/1000340>0.1
true
发布了118 篇原创文章 · 获赞 37 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/woloqun/article/details/89398285