EXCEL中如果A1假设数据段定义如下DA1等于0,那么B1显示“完成计划”,如果A1大于0,那么显示“超额完成“空值显示计划中?

整合各种系统的源数据在一个典型的组织中,数据位于许多不同的系统中。这些支离破碎的数据只提供了整个拼图的一小部分。有必要将来自不同源头的数据放在一个集中的地方,以了解全局。在本章中,我们将带你了解数据整合过程的基础知识。不同类型的数据源让我们从企业可能生成的不同数据源开始讨论。由于本书关注的是构建分析栈的技术问题,下面的分类旨在从技术角度探讨数据源之间的差异。在一个典型的组织中,通常会有这三种类型的数据源。1. 直接从你的主应用程序(应用数据库)出来的数据。如果你是一家通过网站或应用程序(比如亚马逊)进行大部分业务的公司,那么这些数据就存储在你的应用程序中。此类应用程序数据库通常包含对你的业务运营至关重要的所有交易数据。比如说:一个电子商务网站必须有一个包含客户、产品、订单信息的数据库。一个叫车应用必须有一个包含客户、司机、汽车和预订信息的数据库这些数据通常存储在一个和你的应用程序连接的SQL(或NoSQL!)数据库中。你一般通过数据库查询工具来访问这些数据。2. 来自客户关系管理(CRM)、内容管理系统(CMS)、企业资源规划(ERP)或营销系统的数据。这些系统是你组织运作过程中使用的第三方应用程序。例如:CRM工具:Pipedrive,Salesforce,Zendesk。分析系统:谷歌分析,Firebase,Amplitude。营销系统:Facebook广告,谷歌广告,DoubleClick。这些工具一般由第三方管理。正常情况下,你不能直接访问其中的数据。你需要通过这些公司提供的API获得数据,并将这些数据存储在你自己的数据库中。3. 由员工和其他系统手动创建的数据第三类也是最后一类,是由你组织中的员工手动创建的数据。这通常包括像Excel电子表格和谷歌表格这样的格式,但有时也可能以CSV文件、文本文件或PDF报告的形式出现。由于这些数据是人类创建的,没有强制的结构和规则,它们通常是最容易出错的。用于分析的中央数据存储上述系统是你存储和处理数据的地方,而不是你进行分析的地方。为此,你需要一个数据仓库。数据仓库是一个中央数据库,用于存储和处理大量的数据,以达到分析的目的。你可以认为它是你存放其他系统数据副本的地方。数据仓库只不过是一个为分析处理而优化的数据库。我们将在下一节深入探讨数据仓库,但现在,让我们继续关注数据加载过程。数据加载过程是指从多个来源提取数据并将其加载到数据仓库的工作。这个过程也叫提取和加载。现在让我们来看看这个。提取和加载过程提取和加载(EL)是一个非常简单的概念:写一个程序从数据源中提取原始数据,然后将此数据复制(加载)到另一个地方。例如,下面的伪代码从源头(一个MySQL应用程序)加载预订信息(booking)数据,并将它们复制到一个SQL数据仓库它包括三个步骤。运行查询,从源表(bookings)中提取所有数据根据特定的结构,创建目标数据库表。将数据加载到目标数据仓库。source_db = connect_to_source_db();
(这是一个粗略的实现,以说明一个单纯的加载过程)
上面的脚本比较简单,因为它直接从SQL数据库中查询,而且它不处理诸如失败、智能重试等操作。这个脚本可以被设置成每天清晨运行。在实际生产中,你的脚本会复杂很多,因为还有其他要考虑的事情,比如性能优化、故障处理、源系统接口和增量加载。随着时间的推移,维护脚本的人力成本将远远超过它带给你的实际价值。这就是为什么,最好考虑使用现有的数据加载工具来代替脚本。唯一的例外是,如果你的企业有专门的需求,或者你的经营规模相当于Netflix、谷歌和Facebook等大型科技公司。使用数据加载工具好消息是,市面上有大量的免费或付费的数据加载工具。这些工具通常以即插即用的方式运作。它们提供了一个用户友好的界面来连接你的数据源和数据存储,可设置加载间隔和加载模式,并且它们可能还会提供所有数据加载工作的报告。这些数据加载工具通常被称为ETL工具。但这可能会给初学者带来困惑,因为我们所看到的大多数现代工具都不做转换步骤,而是要求你使用专门的转换工具。像StitchData或Talend这样的付费工具通常拥有大量的数据集成选择,包括网络分析平台、软件即服务(SaaS)网络应用、NoSQL和SQL数据库等。不过,这并不是说你一直都需要这样复杂的工具。基本的数据加载能力也经常被捆绑在数据分析平台中,如Holistics、Google Data Studio和Tableau。虽然集成的数量往往没有专用工具那么多,但也足以满足基本的报告需求。如果你不想选择功能齐全的付费产品,你也可以选择开源软件。特别有名的软件包括Airflow和Prefect。与所有的开源软件一样,你可能需要花一些时间来设置他们,并将这些工具整合到你的系统中。我们发现这类产品最近的一个特别有趣的例子是Meltano——GitLab的一个平台,专注于提供开源数据管道。看看Meltano能否激发出一个围绕它的开源社区,将是很有趣的事情。如果他们成功了,我们将拥有一大堆的数据加载器,可以为尽可能多的产品提供服务。好了,让我们来总结一下。以下是一些市场上的数据加载工具,可供你选择:AloomaHevoDataStitchDataTalendPentaho这里还有一些很棒的开源选项(尽管 —— 和所有开源的东西一样,买者自负):PrefectAirflowMeltanoSinger (on which Meltano, above, is built on)如果你仍然不相信,自己写数据加载和ETL脚本是一个坏主意的话,看看Jeff Magnusson的这篇伟大的文章吧(https://multithreaded.stitchfix.com/blog/2016/03/16/engineers-shouldnt-write-etl/),他是以Stitch Fix的数据平台副总裁的身份写的。常见概念如何增量加载数据?一个值得一提的常见概念是增量加载,这是将数据(你猜对了!)增量地加载到数据仓库的概念。随着源系统容量的增长,这个增量加载的概念对于确保系统平稳运行,将变得更加重要。让我们重温一下之前加载预订信息的例子,但这一次,让我们看看如何增量地运行这个转换。我们可以看到,当增量加载运行时,只有2020-01-04的数据会被查询并复制到新表中。为了在上面的伪代码中反映这一点,我们还必须编写一个额外的步骤,以便获取最近创建的预订信息。source_db = connect_to_source_db();
大多数行业标准的数据加载工具都支持增量加载。增量加载能给你带来多大的性能提升?很多。想象一下,你有1亿条预订记录,这些记录以每天1万条的速度增长。使用增量加载:你每天复制1万条记录。在没有增量加载的情况下:你每天处理1亿条记录(随着时间的推移会更多!)。这是加载的10,000倍差异。应该多久执行一次数据加载?根据我们自己的经验,大多数企业的分析用例只需要每天刷新一次数据。还需要注意的是,除非您的用例绝对需要,否则在大多数业务分析中获取实时数据并不是非常重要。要理解其中的原因,请思考以下问题:如果你想查看过去7周的销售数据,是否有必要关注你提出请求的那一刻为止的情况?大多数商业用例只是需要每天刷新分析数据。我们看到的一个常见的设置是,组织有一个管道,它在午夜之后运行,并在人们上班之前完成。这样,当商业用户早上登录时,他们所有的分析报告都会被昨天的数据刷新。摘要有三种不同类型的数据源系统:应用数据、第三方数据和人工数据。为了存储和处理用于分析的数据,你需要一个叫做数据仓库的东西。将数据从源头转移到目标的过程被称为提取和加载。我们回顾了提取和加载在实践中是怎样的过程,并建议你使用现成的工具。我们还讨论了增量加载如何帮助你提高EL过程的性能。在下一节中,我们将讨论拼图的下一个部分:理解数据仓库。理解数据仓库在上一节中,我们谈到了将数据从多个源系统整合(提取和加载)到你的分析数据库的过程。在这篇文章中,我们将具体讨论你的分析数据库,即你的数据仓库。什么是数据仓库?数据仓库是一种分析数据库,它以分析为目的,存储和处理你的数据。数据仓库为你的分析活动,提供了两个主要功能:存储分析数据和处理分析数据。你为什么需要数据仓库?主要有两个用途:首先,如果数据存在不同的地方,你就不能轻易将多个业务功能的数据组合起来。其次,你的源系统不是为运行重度分析而设计的,这样做可能会危及你的业务运营,因为分析增加了这些系统的负载。数据仓库是分析流程中,每一步的核心,它有三个主要目的:存储:在整合(提取和加载)步骤中,你的数据仓库将接收和存储多个来源的数据。加工:在处理(转换和模型)步骤中,你的数据仓库将执行大部分(如果不是全部)密集转换任务。访问:在报告(可视化和交付)步骤中,首先在数据仓库中收集报告,然后再可视化并交付给最终用户。目前,大多数数据仓库使用SQL作为其主要查询语言。引入数据仓库的正确时机是什么时候?言简意赅的答案是,这要视情况而定。这取决于你公司所处的阶段、你拥有的数据量、你的预算等等。在早期阶段,你可能不需要数据仓库,直接将商业智能(BI)工具连接到你的生产数据库就可以了(正如我们在为刚起步的人做的简单架构中提到的)。但是,如果你仍然不确定数据仓库是否适合你的公司,请考虑以下要点:首先,你是否需要分析来自不同来源的数据?在公司的某个阶段,你需要结合来自不同内部系统的数据,以做出更好、更明智的商业决策。例如,如果你是一家餐馆,想分析订单/服务员的比例效率(每周哪个小时的员工最忙与最闲),你需要把你的销售数据(来自POS系统)与你的员工值班数据(来自人力资源系统)结合起来。对于这些分析,如果你的数据位于一个中心位置,就会容易得多。第二,你是否需要将你的分析型数据与你的事务型数据分开?如前所述,你的事务型系统不是为分析而设计的。因此,如果你在你的应用程序中收集活动日志或其他潜在的有用信息,把这些数据存储在你的应用程序的数据库中,让你的分析师直接在生产数据库中工作,可能不是一个好主意。相反,购买一个数据仓库--一个为复杂查询而设计的数据仓库--并将分析数据转移到那里,是一个更好的主意。这样一来,你的应用程序的性能就不会受到分析工作的影响。第三,你的原始数据源是否适合查询?例如,绝大多数BI工具不能很好地与MongoDB这样的NoSQL数据存储合作。这意味着在后端使用MongoDB的应用程序需要将其分析数据转移到数据仓库中,以便数据分析师能够有效地使用它。第四,你想提高你的分析查询的性能吗?如果你的交易数据由几十万行组成,那么创建汇总表,将数据汇总成一个更容易查询的形式,可能是个好主意。不这样做会导致查询速度非常慢--更不用说,这会成为你数据库的一个不必要的负担。如果你对以上任何一个问题的回答是肯定的,那么可能你应该去买一个数据仓库。也就是说,在我们看来,直接买一个数据仓库通常是个好主意,因为在云时代,数据仓库并不昂贵。我应该选择哪个数据仓库?以下是一些常见的数据仓库,你可以从中挑选:亚马逊Redshift谷歌BigQuerySnowflakeClickHouse (自我托管)Presto(自我托管)。如果你刚刚开始,没有强烈的偏好,我们建议你使用Google BigQuery,理由如下:BigQuery对第一个10GB的存储和第一个1TB的查询是免费的。之后是按使用量付费。BigQuery是完全管理的(无服务器)。没有物理(或虚拟)服务器需要启动或管理。由于其架构的原因,BigQuery可以自动扩展。BigQuery会给每个查询自动分配计算资源,这取决于查询的复杂性和数据量,不需要你手动调整计算资源。(注意:我们与谷歌没有任何关系,我们也没有得到报酬来推广BigQuery)然而,如果你有快速增长的数据量,或者如果你有复杂/特殊的使用案例,你将需要仔细评估你的选择。下面,我们介绍一个最流行的数据仓库的表格。我们的目的是让你对最常被选择的数据仓库有一个高层次的了解。这决不是全面的介绍,也不足以帮助你做出一个明智的选择。是什么让数据仓库与普通的SQL数据库不同?在这一点上,你们中的一些人可能会问。"嘿,数据仓库不就像一个存储数据用于分析的关系型数据库吗?我就不能用MySQL、PostgreSQL、MSSQL或Oracle这样的东西作为我的数据仓库吗?"简短的回答是:是的,你可以。长一点的答案是:看情况而定。首先,我们需要理解一些概念。事务型工作负载与分析型工作负载了解两种数据库工作负载的区别是很重要的:事务型工作负载和分析型工作负载。事务型工作负载是正常业务运行的工作负载。当访问者在网络应用中加载一个产品页面时,会向数据库发送一个查询,以获取这个产品,并将结果返回给应用进行处理。SELECT * FROM products WHERE id = 123
(上面的查询搜索ID为123的产品信息)以下是事务型工作负载的几个共同特征:每个查询通常只检索一条记录,或少量的记录(例如,获取一个类别中的前10篇博客文章)。事务型工作负载通常涉及简单的查询,需要很短的时间(不到1秒)。在任何时间点都有大量的并发查询,受应用程序的并发访问者数量限制。对于大型网站,这可能会达到几千或几十万。通常对整个数据记录感兴趣(例如,产品表中的每一列)。分析型工作负载指的是以分析为目的的工作负载,也就是本书谈到的那种工作负载。当运行一个数据报告时,查询将被发送给数据库来计算结果,然后显示给终端用户。SELECT
(上述查询扫描了整个产品表,以计算每个类别中有多少产品)。)
另一方面,分析型工作负载具有以下特征:每个查询通常会扫描表中的大量行。每个查询都很繁重,需要很长的时间(几分钟,甚至几个小时)才能完成并发查询的次数不多,受限于使用分析系统的报告或内部员工的数量。通常只对几列数据感兴趣。以下是事务型与分析型工作负载/数据库的比较表:事务性工作负载有许多简单的查询,而分析型工作负载则有很少的重型查询。分析型数据库的后端是不同的由于上述两种工作负载之间的巨大差异,这两种工作负载的数据库的底层设计也非常不同。事务型数据库是为快速、短时、高并发量的查询而优化的,而分析型数据库是为长时间运行的、资源密集型的查询而优化的。你会问,架构上的差异是什么?这需要一个专门的章节来解释,但其要点是,分析型数据库使用以下技术来保证卓越的性能:列式存储引擎:分析型数据库不是在磁盘上逐行存储数据,而是将数据的列组合在一起并存储。列式数据的压缩:每一列内的数据都被压缩,以减少存储量和加快检索。查询执行的并行化:现代分析型数据库通常在成千上万的机器上运行。因此,每个分析型查询可以分成多个较小的查询,在这些机器上并行执行(分而治之的策略)。现在你可能已经猜到了,MySQL、PostgreSQL、MSSQL和Oracle数据库被设计用来处理事务性工作负载,而数据仓库被设计用来处理分析型工作负载。那么,我可以使用一个普通的SQL数据库作为我的数据仓库吗?就像我们之前说的,是的,你可以,但要看情况而定。如果你刚开始的时候,数据量小,分析用例少,完全可以选择一个普通的SQL数据库作为你的数据仓库(最流行的是MySQL、PostgreSQL、MSSQL或Oracle)。如果你的规模比较大,有很多数据,你还是可以的,但需要适当的调整和配置。也就是说,随着低成本的数据仓库的出现,如 BigQuery、Redshift等,我们会继续建议你使用数据仓库。然而,如果你必须选择一个普通的基于SQL的数据库(例如,你的企业只允许你在自己的网络内托管它),我们建议使用PostgreSQL,因为它有最多的功能支持分析。我们也写了一篇详细的博文讨论这个话题。为什么你应该使用PostgreSQL而不是MySQL来进行分析(https://www.holistics.io/blog/why-you-should-use-postgres-over-mysql-for-analytics-purpose/)。总结在这一节中,我们对数据仓库进行了剖析,并谈到了:数据仓库是中央分析数据库,用于存储和处理你的分析数据。有四种情况可以让你考虑引入数据仓库。数据仓库选型的简单列表数据仓库如何为分析型工作负载而优化,而传统数据库则是为了应对事务型工作负载。ETL与ELT - 有什么大不了的?在前面的章节中,我们已经反复提到两个术语。ETL和ELT。在本节中,我们将深入探讨这两个过程的细节,研究它们的历史,并解释采用其中一个而不是另一个会带来什么影响。请注意,在你阅读了下一节的《ELT范式中的数据转换》之后,本节的一些内容会更有意义。ETL过程在任何组织的分析工作流中,最密集的步骤通常是数据准备步骤:即组合、清理和创建数据集,为业务使用和决策做好准备。这个过程通常被称为ETL (Extract、Transform和Load),它标识了所涉及的三个不同的阶段。这个过程中,ETL工具从不同的数据源系统中提取数据,通过应用计算、串联等方式对数据进行转换,最后将数据加载到数据仓库。其中会发生什么:你从源头上提取数据(在你的SQL数据库上写查询,或通过API向一个应用程序发送数据提取请求)。提取的数据将在ETL工具的内存中进行转换。转化后的数据再加载到最终的数据存储/仓库中。这里需要注意的关键是,原始数据是在数据仓库之外转化的,通常是在一个专门的 "中转服务器 "的帮助下进行的;而且只有转化后的数据才会被加载到仓库中。ELT过程ELT是一种看待这个问题的不同方式。ELT不是在数据加载到数据库之前对其进行转换,而是在数据仓库内进行转换。你的数据将首先被加载到数据仓库,然后在原地进行转换。这种方法会发生什么:你从来源中提取数据。使用管道工具,而不是在内存中进行转换,你直接将提取的原始数据加载到目标数据存储/仓库中。最后,在你的数据仓库内执行任何必要的转换。这里需要注意的关键是,原始数据在数据仓库内被转化,而不需要一个中转服务器;你的数据仓库现在同时包含了原始数据和转化后的数据。从ETL到ELT的迁移从历史上看,建立数据仓库是一项非常昂贵的工作,无论是在硬件方面还是在软件方面。在20到30年前,一个数据仓库项目的服务器成本、实施成本和软件成本很容易达到数百万美元,并需要几个月的时间来实施。由于数据仓库是如此昂贵,为了节省成本,人们只想把干净的、经过适当转换和汇总的数据加载到数据仓库。当时的从业人员仍然遵循瀑布式的开发模式,所以花时间去计划和执行适当的转换是可以接受的。在这种情况下,ETL模型是非常有意义的:原始数据在被加载到你那昂贵的数据仓库之前,在一个暂存服务器(或ETL管道工具)中进行适当的转换。那时这类工具处理的数据量相对较小,因此大多数中转服务器可以完成处理。但是,如果用更现代的眼光来看,ETL方法有很多缺点:每次新的转换都需要IT部门或数据工程部门的参与,以便对新的转换进行编码。传统上有SQL背景的数据分析师很难操作旧范式中使用的ETL工具。因此,数据分析师依靠数据工程师来获取新的转换数据,而且这往往要等上几天。随着数据规模的增加,ETL方法变得越来越有问题。具体来说,中转服务器--也就是协调所有数据加载和转换的机器--开始成为瓶颈。那么,有什么变化呢?嗯,在2010年代出现了几件事情,使另一种方法成为可能:首先,我们看到云数据仓库的商品化。今天的现代数据仓库能够以极低的成本存储和处理大量的数据。其次,我们也看到了数据量和种类的爆炸。我们中的一些人听说过这种变化,即 "大数据革命"--这是2010年代中期的一种流行趋势。然而,这股热潮最终对我们所有人都有好处:它推动了数据新工具和新方法的开发,这些工具和方法都假设我们需要处理TB级以上的数据。最后,我们看到精益和敏捷软件开发方法的兴起。这意味着人们开始对他们的数据部门有了更多的期望,希望他们能像软件开发团队一样快速执行。因此,在某个时候,人们开始意识到:存储和处理数据的成本已经变得如此便宜,现在有一个更好的主意,就是在做任何转换之前,将所有的数据转存到一个中心位置。这就为ELT方法的发展埋下了种子。与ETL相比,ELT方法有很多优点:它消除了暂存服务器/ETL管道工具的性能瓶颈。这一点很重要,因为数据仓库的处理能力已经提高到远远超过最先进的ETL流水线工具的水平。ELT方法的核心是假设一个强大的数据仓库。它并不要求事先对哪些数据进行详细的规划。数据从业者开始采取更敏捷的分析方法,也就是 "先转储,后转换"。有了适当的转换和建模工具,ELT不需要数据工程师随时待命来支持分析团队的任何转换请求。这增强了数据分析员的能力,并提高了执行速度。正如我们在《好的分析堆栈的偏见》中所说,我们赞成ELT而不是ETL,我们相信所有现代分析堆栈都应该这样设置。下面是一个简短的表格,以总结ETL和ELT的区别。数据湖怎么样?在这一点上,值得一问:数据湖呢?它是如何融入我们刚刚讨论的ELT与ETL范式的?让我们回顾一下。数据湖是一个花哨的术语,指的是原始数据的中央集散地。这个想法是把你组织中的所有东西都倒入一个中央湖,然后再把它装入你的数据仓库。与数据仓库不同(我们在上面关于ELT的章节中已经广泛讨论过),数据湖通常是对象桶,你可以向它上传各种形式的非结构化数据:桶的例子是AWS S3或谷歌云存储等服务;非结构化数据的例子是从各种源系统导出的CSV甚至文本文件。重要的是要明白,数据湖并不是一个新的想法。自80年代以来,商业智能项目通常包括一个数据暂存区。然后,ETL系统将从该暂存区获取数据,并在工具中对其进行转换,然后将其加载到数据仓库中。这里唯一的新东西是这个术语本身--这个术语可以追溯到Pentaho首席技术官James Dixon在2010年的一篇博文(https://jamesdixon.wordpress.com/2010/10/14/pentaho-hadoop-and-data-lakes/)。我们对数据湖没有强烈的感觉。ELT的意义在于,首先将非结构化数据加载到你的数据仓库中,然后在其中进行转换,而不是通过管道工具在飞行中转换数据。在加载之前,这些原始数据是否位于对象桶中,对我们来说并不关心。总结最后,当你挑选分析工具时,问问自己:这个工具是假定采用ETL方法,还是假定采用ELT方法?任何需要在数据仓库之外进行数据转换的工具都应该在你的头脑中敲响警钟;这意味着它是为过去而建,而不是为未来而建。选择ELT。正如我们很快将在第三章看到的,ELT所释放的不仅仅是我们上面谈到的操作优势。在ELT范式中转换数据什么是数据转换?数据转换是一个将现有数据的结构改变为其他结构的过程(因此是“转换”)。数据转换的常见用例包括:数据清洗。你纠正、删除或更新记录集中不准确的记录。汇总数据。你将数据汇总成一个更加总结性的版本。例如,按不同地区和类别计算交易数量,并将其存储到一个新的表中。预先计算。在转换步骤中,您根据业务公式计算新的数字,将原始数据转化为业务数据(例如,您计算一个比率,或一个趋势)。为什么我需要转换数据?存入数据仓库的原始数据,采用的数据格式通常是为事务型系统而设计的。为了有效地分析这些数据,需要一个转换步骤来使其更容易分析。有些人把这称为 "数据建模"。我们将在下一章讨论建模问题,但请注意,数据转换不仅仅包括建模。好的数据转换会产生以下好处:可复用性。可以将每个数据转换看作表示某些业务逻辑的数据组件,并且该数据组件可以在不同的报告和分析中多次复用。你的报告和分析将更加一致。由于上述可复用性,当涉及到报告时,不用将SQL逻辑重写到多个报告中,而是在转换中编写逻辑,并在多个报告中复用。这可以帮助您避免这种情况:即两个不同的数据报告为相同的指标生成两个不同的数字。提高整体运行性能。如果对数据进行了转换和汇总,那么在运行时只需要进行一次计算。这将减少报表处理时间并显著提高性能。成本效益。更少的重复计算将导致更低的计算和服务器成本。在ELT范式中实施数据转换在过去,数据转换通常是由ETL工具完成的,然后再加载到数据仓库。这意味着大量的数据工程参与,因为是工程师创建和维护这种转换管道。这些管道也经常用一些编程语言或脚本语言来实现。我们引入ELT的概念并不是偶然的,随着更强大的数据仓库出现,ELT也得到了发展。在这个范式中,数据在被转换之前就被加载到数据仓库中。这使我们可以做两件事。首先,它允许我们只使用SQL来编写转换。因此,一个转换是创建一个新的表,该表在同一个数据仓库中创建,并存储转换的结果。第二,它允许分析员编写转换。这消除了对数据工程的依赖,并把我们从用外部工具建立和维护管道中解放出来。(我们已经在ETL与ELT--有什么大不了的?提及,所以如果你还没有阅读,我们建议你阅读。)我们来看看这到底是什么样子。假设我们正在运行一个酒店预订网站,并希望根据几个维度创建每日预订的摘要。在这种情况下,我们想看的维度是国家、预订平台等。我们的原始预订数据在加载到数据仓库后会是这样的:Table bookings {
(使用DBML编写的语法)
我们想把它们转化为一个bookings_daily表,就像这样。因此,为了实现这一点,转换工作的代码将是:-- Transform: Summarize bookings by country and platform BEGIN;上面的代码:创建一个名为bookings_daily的表(如果该表已经存在,则重新创建)。运行一个SQL转换查询来计算聚合,并将结果加载到新创建的表中。在这个过程中,该代码还通过与国家字典表表的连接,将国家代码变成适当的国家名称。所有这些都是在数据库事务中完成的,因此,如果事情在半途失败,就会恢复到之前的状态。为了将上述SQL代码部署到生产中,我们设置了一个每天运行SQL文件的cron job。这是最基本的方法,我们的cron job的内容将看起来像这样:$ psql transforms/bookings_daily.sql
在上面的例子中,主要的转换逻辑只在代码块末尾的除了使用SQL表来存储转换结果,我们也可以选择创建一个数据库视图(这意味着我们只存储定义),或者我们可以为它创建一个物化视图。使用数据转换工具在实践中,使用专用的转换工具(如Holistics、dbt、dataform等)会处理SQL样板文件,让您只关注核心转换逻辑。例如,下面的屏幕截图显示了如何使用Holistics来完成这一工作。用户专注于写SQL来转换数据,而软件则处理模型的创建。Holistics允许你选择将其保存为一个 "视图 "或一个 "物化视图"(作为一个新的表保存到数据仓库)。转换工作流程(或DAG)上面的部分谈到了单一的转换步骤。但当你有多个相互依赖的转换时,你会遇到 "依赖性管理 "的问题。例如,假设你有两个转换作业:一个是计算销售收入,另一个是根据收入计算销售佣金。你希望只有在收入计算完成后才运行佣金作业。这个概念被称为DAG(有向无环图)工作流。下图是对它最好的解释。在上面的图中:数据仓库内的每个节点代表一个表,左边的一列(A、B、C、D)是从源系统加载到数据仓库的表。箭头代表依赖关系。这意味着为了创建表E,我们需要来自表A、B和C的数据。表E到I是转换过的表,通过运行相应的转换作业创建。你可以清楚地看到,作业E应该在作业A、B、C完成后运行,而作业I应该在D和F都完成后才运行。这就是DAG工作流的依赖性属性的作用。在实践中,大多数数据转换工具都支持DAG工作流。在较早的范例中,经典ETL工具尤其如此。无论您处于哪种范式,您的工作都将集中于管理每个转换的逻辑及其依赖关系。继续前面使用Holistics的例子,一旦你用SQL定义一个转换工作,Holistics会自动读取转换查询,然后为它计算一个依赖工作流。使用ETL进行传统数据转换的注意事项到目前为止,我们一直在讨论的例子是在ELT模型的背景下完成的,这意味着转换直接发生在数据仓库内。我们现在要谈一谈比较经典的方法的缺点。正如我们之前提到的,在数据被加载到数据仓库之前,数据转换曾经在编程或脚本语言中进行。下面是一个使用Ruby编程语言完成转换步骤的例子。# Extract: users is an array of users loaded from the Extract phase
这种方法的主要缺点是,大部分的负载都在运行脚本的单机上(它必须处理数百万条数据记录)。
在数据仓库缓慢而昂贵的时候,这种方法运作良好。在数据量相对较小的时候,它也很有效。鉴于这些限制,数据专业人员会寻找方法将所有的处理卸载到数据仓库之外,这样他们就可以只在仓库中存储经过清理的、建模的数据,以减少成本。然而,近年来,数据仓库的成本已经大幅下降,而性能却大幅提高。今天,在数据仓库中运行转换通常比在普通机器上运行的代码中执行转换更具成本效益。因此,我们看到了将所有处理转移到数据仓库本身的趋势(ELT)。你可以在本书中“整合各种系统的源数据”章节阅读更多的内容。高级主题:增量转换以优化性能在我们前面的 "数据加载 "一节中,我们谈到了增量加载,即从源头到目的地只加载差异数据。数据转换也存在类似的概念。让我们再来看看前面的例子:bookings → bookings_daily 。这一次,让我们看看如何增量地运行这个转换。在上图中,你可以看到,当转换作业运行时,只有2020-01-04的数据会被处理,只有两条新记录会被追加到bookings_daily表中。这能为我们节省多少成本?相当多了。想象一下,你的预订有1亿条记录,并且以每天1万条记录的速度增长。有增量转换:你每天只处理1万条记录没有增量转换:你每天处理1亿条(而且还在增长)记录。实践中的增量转换在实践中,SQL中的增量转换应该是这样的:destination: bookings_daily incremental:添加了[[ts::date > {{max_value}}]],这样工具就会从目标表中提取增量列的最新值,并在SQL查询中替代它。有了这个,只有较新的数据被物化到目标表中。什么时候可以不运行增量转换?如果你看一下上面的例子,很明显,有时你不能运行增量转换:当旧的已转换数据还在不断变化时。对增量转换的一个简单观察是,它通常只在之前的转换/加载步骤也是“增量的”(即您可以以增量的方式转换预订表)的情况下才起作用,尽管这可能并不总是正确的。}

A单元格中的数值是我用公式算出来的,如果A单元格中的数值大于0,则B单元格中的数值就为0,如果A单元格中的数值小于0,则B单元格中的数值等于A单元格中的这个负数,求大神指...
A单元格中的数值是我用公式算出来的,如果A单元格中的数值大于0,则B单元格中的数值就为0,如果A单元格中的数值小于0,则B单元格中的数值等于A单元格中的这个负数,求大神指教这个公式是什么样的,在线急等,跪求!
展开选择擅长的领域继续答题?
{@each tagList as item}
${item.tagName}
{@/each}
手机回答更方便,互动更有趣,下载APP
提交成功是否继续回答问题?
手机回答更方便,互动更有趣,下载APP
展开全部如上图,在B1单元格输入:=IF(A1>=0,0,A1),下拉公式已赞过已踩过你对这个回答的评价是?评论
收起
展开全部=IF(A1>=0,0,A1)
本回答被提问者采纳展开全部=MIN(0,A1)
收起
2条折叠回答
收起
更多回答(3)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
为你推荐:
下载百度知道APP,抢鲜体验使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。扫描二维码下载
×个人、企业类侵权投诉
违法有害信息,请在下方选择后提交
类别色情低俗
涉嫌违法犯罪
时政信息不实
垃圾广告
低质灌水
我们会通过消息、邮箱等方式尽快将举报结果通知您。说明
做任务开宝箱累计完成0
个任务
10任务
50任务
100任务
200任务
任务列表加载中...
}

我要回帖

更多关于 假设数据段定义如下DA1 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信