云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

数据库_建设公司的网站_代金券

小七 141 0

潜入三角洲湖:模式实施与演化

在Databricks中试试这个笔记本系列数据和我们的经验一样,总是在不断发展和积累。为了跟上时代,我们对世界的心理模型必须适应新的数据,其中一些数据包含了新的维度,即用新的方式看待我们以前没有概念的事物。这些心理模型与表格的模式没有什么不同,它们定义了我们如何对新信息进行分类和处理。这就引出了模式管理。随着业务问题和需求的发展,数据的结构也会随之变化。对于三角洲湖,随着数据的变化,合并新的维度很容易。用户可以访问简单的语义来控制表的模式。这些工具包括模式强制(schema enforcement),它可以防止用户意外地用错误或垃圾数据污染表,以及模式演化(schema evolution),当这些列属于富数据时,它们能够自动添加新的富数据列。在这个博客中,我们将深入探讨这些工具的使用。了解表模式ApacheSpark中的每个数据帧™包含架构、定义数据形状(如数据类型和列)以及元数据的蓝图。对于Delta-Lake,表的模式以JSON格式保存在事务日志中。什么是模式强制?模式强制,也称为模式验证,是Delta-Lake中的一种安全措施,它通过拒绝对与表模式不匹配的表的写入来确保数据质量。就像只接受预订的繁忙餐厅的前台经理一样,它会检查插入到表中的数据中的每一列是否在其预期列的列表中(换句话说,每个列是否都有"预订"),并拒绝任何不在列表中的列的写操作。模式强制是如何工作的?deltalake在写入时使用模式验证,这意味着在写入时检查表的所有新写操作是否与目标表的模式兼容。如果模式不兼容,deltalake会完全取消事务(不写入数据),并引发异常,让用户知道不匹配。为了确定对表的写入是否兼容,Delta Lake使用以下规则。要写入的数据帧:不能包含目标表架构中不存在的任何其他列。相反,如果传入的数据不包含表中的每一列,也没关系,这些列将被简单地分配为空值。列数据类型不能与目标表中的列数据类型不同。如果目标表的列包含StringType数据,但DataFrame中对应的列包含IntegerType数据,则架构强制将引发异常并阻止执行写入操作。不能包含仅大小写不同的列名。这意味着不能在同一个表中定义"Foo"和"Foo"等列。虽然Spark可以在区分大小写或不区分大小写(默认)模式下使用,但是Delta-Lake保留大小写,但在存储模式时不敏感。Parquet在存储和返回列信息时区分大小写。为了避免潜在的错误、数据损坏或丢失问题(这是我们在Databricks亲身经历的),我们决定添加这个限制。为了说明这一点,我们来看看下面的代码,当试图将一些新计算的列附加到尚未设置为接受它们的Delta-Lake表时会发生什么。#生成一个贷款的数据帧,我们将把它附加到Delta-Lake表中贷款=sql(""选择"计数为(10)"(按"计数"*"计数为",铸造(兰特(10)*10000*双倍计数)作为金额由_state_delta贷款""")#显示原始数据帧的架构原创_贷款.printSchema()"""根|--地址状态:字符串(可为null=true)|--count:整数(可为null=true)"""#显示新数据帧的架构贷款.printSchema()"""根|--地址状态:字符串(可为null=true)|--count:整数(可为null=true)|--金额:双精度(可空=true)#新列"""#尝试将新的数据帧(带新列)附加到现有表贷款.write.format("三角洲")\.mode("append")\.save(DELTALAKE_路径)""返回:写入增量表时检测到架构不匹配。要启用架构迁移,请设置:'.option("mergeSchema","true")\'表架构:根--地址状态:字符串(可为null=true)--计数:long(可为null=true)数据架构:根--地址状态:字符串(可为null=true)--计数:long(可为null=true)--金额:双精度(可空=真)如果启用了表ACL,这些选项将被忽略。请使用ALTER TABLE命令更改架构。"""deltalake没有自动添加新列,而是强制执行模式并停止写入。为了帮助识别导致不匹配的列,Spark打印出堆栈跟踪中的两个模式以进行比较。模式强制有何用处?因为这是一个非常严格的检查,所以模式强制是一个很好的工具,可以用来作为一个干净的、完全转换的数据集的看门人,该数据集可以用于生产或消费。它通常在直接提供以下内容的表上强制执行:机器学习算法BI仪表盘数据分析和可视化工具任何需要高度结构化、强类型、语义模式的生产系统为了为最后的障碍准备数据,许多用户使用一种简单的"多跳"体系结构,这种体系结构逐步向表中添加结构。要了解更多信息,请看一篇题为"Delta Lake产品电离机器学习"的帖子。当然,模式强制可以在您的管道中的任何地方使用,但是请注意,如果流式数据写入表失败,可能会有点令人沮丧,例如,您忘记向传入数据添加了一列。防止数据稀释在这一点上,你可能会问自己,有什么大惊小怪的?毕竟,有时一个意外的"模式不匹配"错误会让您在工作流程中出错,尤其是您刚接触Delta Lake。为什么不让模式改变,不管它需要什么,这样我就可以写我的数据帧了?正如一句老话所说,"一盎司的预防胜过一磅的治疗。"在某个时候,如果你不执行你的模式,数据类型兼容性的问题会使他们的脑袋变得丑陋——表面上同质的原始数据源可能包含边缘情况、损坏的列、错误的映射或其他可怕的东西,这些东西会在夜间发生碰撞。一个更好的方法是在关口阻止这些敌人——使用模式强制——并在白天而不是在晚些时候对付他们,因为他们会潜伏在你的产品代码的阴影深处。模式强制可以让您放心,除非您做出正确的选择来更改表的模式,否则它不会更改。它可以防止数据"稀释",当频繁地添加新列时,会发生这种情况,以前丰富、简洁的表由于数据泛滥而失去了意义和有用性。通过鼓励您有意为之,设置高标准,并期望高质量,模式实施正是在做它的设计目的——保持您的诚实,保持表的整洁。如果经过进一步的检查,您确定您确实想添加这个新列,那么这是一个简单的、单行的修复,如下所述。解决方案是模式进化!什么是模式进化?模式演化是一种允许用户轻松更改表的当前模式以适应随时间变化的数据的特性。最常见的情况是,在执行追加或覆盖操作时使用它,以自动调整模式以包含一个或多个新列。模式进化是如何工作的?继上一节中的示例之后,开发人员可以轻松地使用模式演化来添加以前由于模式不匹配而被拒绝的新列。通过向.write或.writeStream Spark命令添加.option('mergeSchema','true')来激活架构演化。#添加mergeSchema选项贷款.write.format("三角洲")\.option("mergeSchema","true")\.mode("append")\.save(DELTALAKE_SILVER_路径)要查看绘图,请执行以下Spark SQL语句。#用新列创建绘图以确认写入成功%sql语言选择addr\u state,sum(`amount`)作为amount由_state_delta贷款按地址状态分组按金额排序(`amount`)描述限制10或者,您可以通过添加spark.databricks.delta.架构.自动合并=与您的Spark配置一致。请谨慎使用,因为架构强制将不再警告您意外的架构不匹配。通过在查询中包含mergeSchema选项,在数据帧中但不在目标表中的任何列都会作为写入事务的一部分自动添加到模式的末尾。也可以添加嵌套字段,这些字段也将添加到它们各自的struct列的末尾。数据工程师和科学家可以使用此选项在现有机器学习生产表中添加新列(可能是新跟踪的指标,或本月销售数据的一列),而不会破坏依赖旧列的现有模型。在表追加或重写期间,以下类型的架构更改符合架构演化的条件:添加新列(这是最常见的情况)从NullType->any other type更改数据类型,或从ByteType->ShortType->IntegerType向上转换数据类型其他不符合模式演化条件的更改要求通过添加.option("overwriteSchema","true")覆盖模式和数据。例如,如果列"Foo"最初是整数数据类型,而新架构将是字符串数据类型,则需要重新写入所有Parquet(数据)文件删除列更改现有列的数据类型(就地)重命名仅与ca不同的列名