数据质量问题往往是在业务方发现报表数字不对之后才被动的暴露出来,排查起来费时费力。与其事后救火,不如在数据管道的关键节点上加入自动化的质量检查。Soda就是为此而生的一款开源工具,它通过声明式的YAML配置来定义检查规则,支持PostgreSQL、MySQL、Snowflake、BigQuery等几十种数据源,检查结果可以输出到命令行、日志系统,也可以对接Soda Cloud做可视化和告警。本文将以Ubuntu系统为例,完整演示Soda的安装、配置和检查规则的编写过程。

部署前的环境准备
Soda Core是基于Python开发的命令行工具,官方要求Python版本在3.8以上,因此第一步是确认Ubuntu上的Python环境。Ubuntu 20.04及其之后的版本默认自带Python 3.8+,可以先执行python3 --version查看版本。如果版本过低,建议通过deadsnakes仓库安装较新版本,不要直接动系统自带的Python,以免影响apt等系统工具的正常运行。
推荐的做法是为Soda单独创建一个虚拟环境,避免依赖包和系统其他Python项目冲突。使用venv模块即可完成:
sudo apt update sudo apt install python3-venv python3-pip -y mkdir -p ~/soda && cd ~/soda python3 -m venv venv source venv/bin/activate python --version
激活虚拟环境后,命令行提示符前会出现(venv)标识,后续所有pip安装操作都在这个环境中进行。另外需要提前确认网络能访问PyPI仓库,如果服务器在内网,需要配置好pip的镜像源或代理。
安装Soda Core并配置数据源
Soda Core的安装包按数据源拆分成了不同的发行版,比如连接PostgreSQL要安装soda-core-postgres,连接MySQL则安装soda-core-mysql。这样按需安装可以减少不必要的依赖。以最常见的PostgreSQL为例:
pip install soda-core-postgres soda --version
安装完成后需要创建两个配置文件。第一个是数据源配置文件,用来告诉Soda连接哪个数据库;第二个是检查规则文件,用来定义具体的质量检查项。数据源配置示例如下:
# configuration.yml
data_source my_postgres:
type: postgres
host: 127.0.0.1
port: 5432
username: soda_user
password: "${POSTGRES_PASSWORD}"
database: sales_db
schema: public
密码建议通过环境变量的方式注入,避免明文写在配置文件里被误提交到代码仓库。如果不想用环境变量,也可以使用soda scan时通过-v参数传值,或者用.soda.env文件管理,记得把它加入.gitignore。
编写检查规则并执行扫描
检查规则文件是Soda的核心,所有质量逻辑都声明式地写在这里。规则的语法结构是checks for 表名后面跟具体的检查项,支持行数、空值率、重复值、值范围、 freshness等多种内置检查类型。
# checks.yml
checks for orders:
- row_count >= 1000
- missing_count(customer_id) = 0
- duplicate_count(order_no) = 0
- invalid_count(amount) = 0:
valid min: 0
- freshness(created_at) < 1d
checks for customers:
- row_count > 0
- missing_percent(email) < 5
上面这段配置对orders表做了五项检查:行数不少于1000、customer_id不允许为空、订单号不允许重复、金额必须大于等于0、数据新鲜度不能超过1天。每一项检查都会在扫描时生成一个明确的结果,通过或者失败一目了然。
执行扫描的命令如下,其中-d指定数据源名称,必须和配置文件里定义的名称一致:
soda scan -d my_postgres -c configuration.yml checks.yml
命令执行后,终端会输出每条检查的执行结果,包括通过、失败和警告。失败的检查会附带实际的查询值和预期值对比,方便快速定位是数据问题还是规则设置不合理。例如某张表行数检查失败,输出会显示当前实际行数是多少、期望的下限是多少。
常见问题与持续运行方案
部署过程中最常见的问题是连接失败,报错信息通常提示connection refused或authentication failed。前者要检查数据库是否允许远程连接、端口是否开放,PostgreSQL需要确认pg_hba.conf和postgresql.conf的配置;后者则要核对用户名密码,以及该用户对目标schema是否有SELECT权限,Soda的所有检查都依赖查询权限。
另一个容易踩的坑是pip安装时报依赖冲突,尤其是服务器上已有其他Python项目时。坚持使用独立虚拟环境基本可以避免这类问题。如果安装过程中编译psycopg2失败,安装libpq-dev和python3-dev这两个系统包通常就能解决。
单次扫描只是开始,真正的价值在于持续运行。可以把扫描命令写进crontab定时执行:
# 每天早上6点执行数据质量扫描,日志写入指定文件 0 6 * * * cd /home/ubuntu/soda && ./venv/bin/soda scan -d my_postgres -c configuration.yml checks.yml >> /var/log/soda/scan.log 2>&1
如果需要告警和可视化,可以配置Soda Cloud,在配置文件中添加API key后,扫描结果会自动上报到云端控制台,支持配置失败时的邮件或Slack通知。对于不想上云的团队,也可以通过扫描退出码结合自建监控脚本实现简单告警:扫描全部通过时退出码为0,有失败项则为非0,利用这一点在shell脚本里做判断即可。至此,一套在Ubuntu上稳定运行的数据质量检查体系就搭建完成了,后续只需维护检查规则文件,就能持续守护数据管道的健康状态。