如何按程序员思维写分析师脚本

本文针对复杂SQL脚本维护难的问题,设计了一套运行在内部Skone系统上、基于MLSQL和StreamingPro的项目体系。该体系包含function、entity_tables、virtual_tables和job四个子目录,强化了分析师的抽象和复用能力,简化了脚本复杂度,还方便与数仓工程师协作上线。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

今天无意在在某群里,看到一个很复杂的SQL脚本,join很多,子查询很多,union很多,case when也很多。然后就让我们负责分析师脚本管理的同事给我看了下我们分析师的脚本,我发现随便一个竟然都超了三四百行。这脚本维护起来应该是个噩梦。如果要让一个东西好维护,好管理,那一定需要项目化,如何项目化一个脚本呢?

这个其实很像前端,原先前端就是一个html页面,有html,javascript,css等,然后一开始大家就是在一个页面写完所有逻辑,后面出现了Vue,react等框架,把前端单一页面开发项目化了。我们知道,表现层的东西是多变的,难以复用的,比如html代码片段就比较难以复用。同样的,SQL具有很强的表达能力,以及比编程语言更低的使用门槛,但是复用难度也是比较大的。不过你愿意,总是可以的。

设计

针对前面的问题,我设计了一套项目体系,可以让分析师以较为结构化和项目化的思维去完成一个脚本的编写。当然,这个是运行在我们内部的Skone系统之上的,底层的DSl语法则是MLSQL,引擎是StreamingPro。

项目目录结构为如下:

1063603-570301c66d4f3ae9.png
image.png

这是A分析师的一个项目目录,叫analyser。 里面分成了四个子目录。

  1. function 可以复用脚本片段,如果分析师还会写python,则包含udf函数。
  2. entity_tables 分析师使用到的落地中间表。
  3. virtual_tables 分析师使用到的虚拟中间表。
  4. job 分析师任务脚本集合,一个job就是完成一个功能点,比如出一张报表。

function

我们先来看function目录:

1063603-f5ebfafc2dfd58e2.png
image.png

里面包含两种类型的的可复用脚本。第一个是SQL代码片。比如上图里的,我们经常会反复用一个case when,这个时候就可以抽象成一个代码片段。其实说白了就是做了个名字映射。

使用时,可以这样:

1063603-4fb12fb7bfe68b67.png
image.png

另外一个就是如果分析师会一些脚本,那么可以整理自己一些常用的函数库。

1063603-e0a0663700021056.png
image.png

使用时可以这样:

1063603-9627cae49f7c6212.png
image.png

virtual_tables

我们知道,在分析师实际写脚本的时,往往为了完成一个结果,会需要产生大量的中间表,不同的job可能会有依赖同一批中间表。virtual_tables目录使得分析师可以统一管理自己的经常使用的中间表。

1063603-f4ab6c6cd3b18251.png
image.png

这张图例,就是产生了一张表明为 vistor_count_from_three_channes的表。

job

job 目录则是分析师真正完成工作的地方。通常,分析师会include function/virtual_tables里函数或者表在最终job里使用,比如:

1063603-2a7c90c36e49636c.png
image.png

这个过程,分析师导入了votes表,shares表,然后union 了他们,最后追加到hive表里。

总结

通过这套体系,强化了分析师们的抽象和复用能力,也简化了脚本复杂度。分析师自己就很方便构建常用的虚拟表集合,对于经常用到的一些处理逻辑,也可以进行很好的封装。而如果分析师熟悉python脚本,也能更好的进行自主开发。

我们还可以让分析师把项目一键发送给数仓工程师,让他们完成最后的上线过程。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值