10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

Snowflake 中的数据概况:在清理之前发现数据中的混乱 | 技术实践

  • 2025-09-16
    北京
  • 本文字数:1833 字

    阅读完需:约 6 分钟

大小:785.68K时长:04:28
Snowflake 中的数据概况:在清理之前发现数据中的混乱 | 技术实践

我围绕一个模拟的加密货币数据集构建了我的第一个 dbt 项目,而且故意让它变得混乱。为什么?因为分析工程并不是关于完美的数据,而是将不可靠的输入转化为值得信赖的内容。


我没有清理随机的公共数据,而是设计了这个数据集,使其反映出与工作相关的挑战,比如重复数据、不一致的标记和冲突的类别——这些都是分析工程师每天需要解决的问题。


然后,我使用 Snowflake 对原始数据进行概况分析,利用 dbt 进行建模、标准化和测试——构建了一个看起来和实际生产环境中分析工程师所面临的情况相似的数据管道。

为什么数据概况很重要


混乱的数据不仅仅是带来小小的烦恼,它还会:


  • 当值无法转换为正确类型时,导致查询失败。

  • 当类别没有标准化时,造成冲突的度量。

  • 当重复数据或空值出现在报告中时,破坏信任。


尽管我的数据集是模拟的,但我遇到了分析工程师在生产环境中常常面临的同样问题。

这是我在原始交易表中发现的内容:


  • 重复数据 → 大约有 50 个 TRANSACTION_ID 出现了多次,有时仅在大小写上有所不同(t0001118 vs T0001118)。

  • 空值 → USD_FX_RATE 有 2,541 个空值;其他关键列如 USER_ID 和 PRODUCT_ID 则没有。

  • 类别不一致 →

  • 数据类型错误 → 所有列在摄取时都变成了 VARCHAR(16777216)。

  • 缺乏约束 → 数据仓库层面没有强制执行唯一性或外键约束。


换句话说:这就是一个完美的练习场,帮助我解决真实的数据质量问题。

我如何在 Snowflake 中对数据进行概况分析


我编写了一个 SQL 脚本(tx_profiling.sql),在 Snowflake 中运行系统性的检查。


模式和数据类型


desc table FINANCING_PRODUCTS.PUBLIC.raw_transactions; 
复制代码


✔ 确认所有列都是 VARCHAR(16777216) ✔ 验证没有键或约束

重复数据和唯一性检查

 

select transaction_id, count(*) from FINANCING_PRODUCTS.PUBLIC.raw_transactionsgroup by transaction_idhaving count(*) > 1; 
复制代码


✔ 发现大约 50 个重复的 transaction_id

空值分析


select  sum(case when usd_fx_rate is null then 1 else 0 end) as null_fx_rate,  sum(case when asset_amount is null then 1 else 0 end) as null_asset_amountfrom FINANCING_PRODUCTS.PUBLIC.raw_transactions; 
复制代码


✔ USD_FX_RATE 中有 2541 个空值 ✔ 关键字段中没有空值

值范围

 

select  min(asset_amount), max(asset_amount),  min(usd_fx_rate), max(usd_fx_rate)from FINANCING_PRODUCTS.PUBLIC.raw_transactions; 
复制代码


✔ 发现 NaN 和负资产金额 ✔ 外汇汇率从 0.8001 到 1.4998,符合实际,但不完整

域名检查

 

select distinct transaction_action from FINANCING_PRODUCTS.PUBLIC.raw_transactions; 
复制代码


✔ 13 个不一致的 transaction_action 值

我对 Snowflake 的一些发现


由于我的数据集规模较小且是模拟数据,数据概况查询运行顺利。这是一个优势——它让我能集中精力在工作流上,而不是等待查询完成。


即使在这个规模下,我也能练习真实团队在处理数 TB 数据时使用的相同步骤:


  • 使用 DESCRIBE 检查模式和数据类型。

  • 使用 TRY_TO_NUMBER 和 TRY_TO_TIMESTAMP_NTZ 安全地进行类型转换。

  • 使用 ROW_NUMBER() OVER (PARTITION BY …) 进行去重。

  • 让 dbt 将暂存模型作为 Snowflake 中的视图进行物化。


教训是什么?工作流是可以扩展的。那些在我模拟数据上有效的 SQL 模式,正是公司在生产环境中依赖的方式——Snowflake 只是处理了数据量的问题。

从数据概况到建模


数据概况不仅仅是打勾那么简单,它为我在 dbt 中的暂存模型提供了蓝图:

  • 将 ASSET_AMOUNT 和 USD_FX_RATE 转换为数字类型。

  • 将 EVENT_TIME 和 INGESTION_TS 转换为时间戳类型。

  • 在 TRANSACTION_ID 上进行去重,保留最新的一行数据。

  • 使用种子映射(如 asset_symbol_map、risk_flag_map、transaction_action_map)对分类字段进行标准化。

  • 使用 dbt 测试强制执行相同的规则(唯一性、非空、接受的值)。

  • 简而言之:数据概况转化为转换逻辑,而转换逻辑转化为测试。

心得体会


这个项目让我学到:数据概况是分析工程的起点。


为我提供了一个平滑的环境,可以检查和查询原始数据。dbt 给了我建模、测试和文档化修复的框架。它们结合在一起,形成了一个管道,将不可靠的模拟加密货币数据转化为值得信赖的数据。


数据可能很小,但工作流是分析工程师在大规模应用中使用的相同流程:从数据概况开始,带着明确目标进行建模,并通过测试强制执行数据质量。


原文地址:https://www.linkedin.com/pulse/data-profiling-snowflake-finding-mess-before-you-clean-wilkinson-7xwee/?trackingId=1jZAlK6wRHmbhkyKXqfrmg%3D%3D


2025-09-16 17:5724

评论

发布
暂无评论

从零开发区块链应用(十)--golang协程使用

杰哥的技术杂货铺

golang 区块链 gotoutine

Spring Boot Admin 添加报警提醒和登录验证功能!

王磊

来自未来的交互设计!当电影中的一切变为现实,设计师要如何进化?

博文视点Broadview

RocketMQ 源码探究 -- 延迟队列实现

周文童

RocketMQ #java

架构学习【01】——架构图初探

tiger

架构实战营

ReactNative进阶(二十九):BloC 模式

No Silver Bullet

React Native 1月月更 BloC

发布uniapp【uniapp 专题 02】

坚果

1月月更

全栈工程师?你知道全流程工程师吗?

蜜糖的代码注释

Java 开发 后端技术

25 Prometheus最佳实践原则

穿过生命散发芬芳

Prometheus 1月月更

【架构训练营-模块一】

默光

微信 架构设计

微信业务架构图、学生管理系统毕业架构设计

石小天

架构实战营

架构设计图

风中奇缘

架构实战营 「架构实战营」

【译】什么是测试驱动开发

宇宙之一粟

测试驱动开发 1月月更

鉴释加入龙蜥社区,助力开源生态建设

OpenAnolis小助手

Linux 开源 社群 合作伙伴

2021总结和2022趋势--《香帅中国财富报告》(7/100)摘录

hackstoic

投资

sonic:基于 JIT 技术的开源全场景高性能 JSON 库

火山引擎开发者社区

原生云

有的时候我觉得我不会 Markdown

冴羽

前端 写作 markdown markdown语法 vuepress

从零开发区块链应用(七)--gin框架参数获取

杰哥的技术杂货铺

golang 区块链 gin框架

一线开发人员,你对项目了解多少?

蜜糖的代码注释

Java 程序员 后端技术

投稿开奖丨“轻量应用服务器”征文活动(11&12月)大奖公布

阿里云弹性计算

阿里云 轻量应用 征文投稿开奖

IDEA注释模板,惊艳了,动作要快,姿势要帅

碌碌无为小码农

Java 架构 程序人生 编程语言 经验分享

基于Calcite的分布式多数据源查询

麒思妙想

MySQL 数据库 Apache Calcite gbase8a

01uni-app基础教程 环境配置【uniapp专题1】

坚果

uni-app 1月月更

03uniapp的生命周期【uniapp 专题 03】

坚果

小程序 uniapp 1月月更

TiDB Cloud 上线亚马逊云科技 Marketplace,为全球用户提供云端一栈式实时 HTAP 数据库体验

PingCAP

从重大漏洞应急看云原生架构下的安全建设与安全运营(下)

腾讯安全云鼎实验室

云原生 安全漏洞 容器安全 安全服务

对管理金字塔游戏的感悟:管理的本质是协作

panda

管理

微信业务架构图与“学生管理系统”毕设架构设计

唐尤华

架构实战营

从零开发区块链应用(六)--gin框架使用

杰哥的技术杂货铺

golang 区块链 gin框架

从零开始学Mysql - 字符集和编码(下)

懒时小窝

干掉 PowerDesigner,这款数据库设计神器真的绝了!!!

沉默王二

Snowflake 中的数据概况:在清理之前发现数据中的混乱 | 技术实践_DataOps_River W._InfoQ精选文章