本练习要求你为一个常见情况勾勒出一个基础数据管道。这需要理解数据管道的组成部分——包括抽取、转换、加载——以及ETL和ELT之间的区别。目标不是编写代码,而是将数据流和涉及的步骤可视化。场景:每日网站用户活动报告想象一下你在一家电商公司工作。你的团队需要一份每日报告,概括每位用户在前一天访问网站的独立页面数量。这份报告将帮助市场团队了解用户活跃度。以下是你已知的信息:数据源: 网站活动以JSON文件形式记录。每天生成一个新文件,包含当天所有的用户交互(点击、页面浏览)。文件中的每条记录都包含时间戳、用户ID、页面URL和其他详细信息。这些文件存储在指定的云存储位置。要求: 在公司关系型数据库中生成一张汇总表。该表应包含三列:report_date(报告日期)、user_id(用户ID)和 distinct_pages_visited(访问的独立页面数)。频率: 报告需要每天更新一次,汇总前一天的活动。你的任务勾勒一个数据管道以满足此要求。你可以在纸上绘制简单的图表(例如方框和箭头),或者使用文本编辑器列出步骤。在你的勾勒中考虑以下几点:识别来源: 数据从何而来?识别目标: 最终处理后的数据应存储在哪里?抽取步骤: 你将如何从源获取数据?转换步骤: 原始数据需要进行哪些处理才能满足报告要求?思考:读取数据格式(JSON)。选择所需字段(用户ID,页面URL)。计算当天每位用户的独立页面访问次数。添加报告日期。加载步骤: 转换后的数据将如何进入目标数据库?ETL还是ELT? 你的过程更接近抽取、转换、加载(ETL),还是抽取、加载、转换(ELT)?编排: 这个管道将如何每天自动运行?(考虑简单的调度)花几分钟时间根据上述情况勾勒出你的管道。示例勾勒与说明这是勾勒此管道的一种可能方式。我们可以用一个简单图表将其直观地表示出来。digraph G { rankdir=LR; node [shape=box, style=filled, color="#ced4da", fontname="Arial"]; edge [fontname="Arial"]; splines=ortho; "每日JSON日志" [fillcolor="#a5d8ff"]; "关系型数据库表" [fillcolor="#96f2d7"]; "每日调度器" [shape=oval, fillcolor="#ffec99"] "每日JSON日志" -> "抽取每日日志文件" [label=" 读取"]; "抽取每日日志文件" -> "转换数据" [label=" 解析JSON\n 过滤\n 聚合"]; "转换数据" -> "加载汇总数据" [label=" 插入行"]; "加载汇总数据" -> "关系型数据库表"; "每日调度器" -> "抽取每日日志文件" [label=" 每日触发"]; }一张图表,说明了数据从JSON日志流向关系型数据库表的过程,由每日调度器触发。让我们分解与此图表对应的步骤:来源: 存储在云存储中的每日JSON日志文件。目标: 关系型数据库中一个名为user_daily_activity(例如)的表。抽取: 一个进程从云存储中读取前一天的相关JSON日志文件。转换:该进程解析每条JSON记录。它提取 user_id 和 page_url 字段。它按 user_id 对记录进行分组。对于每个 user_id,它计算独立 page_url 值的数量。它添加生成报告的日期(例如,昨天的日期)。加载: 该进程将生成的汇总数据(报告日期、用户ID、访问的独立页面数)插入到数据库中的 user_daily_activity 表。ETL还是ELT? 这种方法遵循 ETL 模式。数据被抽取、在内存或临时处理环境中转换(解析、聚合),然后最终结果被加载到数据库中。ELT方法可能会首先将原始JSON数据加载到数据库中的暂存区,然后使用SQL查询直接在数据库内进行转换和聚合。编排: 设置一个简单的每日调度器(如cron作业或基础云调度服务),每天触发一次整个管道过程,通常在上一天的日志文件完成并可用后的清晨。反思你的勾勒将你的勾勒与示例进行比较。你是否识别出相似的步骤?你是否清楚地分离了抽取、转换和加载?你识别出哪些具体的转换?(例如,统计独立项、分组)你如何设想这个过程每天运行?本练习展示了本章讨论的组成部分如何组合起来解决实际的数据传输和处理问题。即使是简单的要求也需要仔细考虑数据流、处理步骤和调度。随着要求变得更复杂,这些管道设计自然会发展,融入更先进的工具和技术,你将在继续数据工程学习的过程中了解到这些。