公司博客上

深入三角洲湖:模式执行&进化

分享这篇文章

在砖试试这个笔记本系列

三角洲湖的标志。

数据,像我们的经历,总是演变和积累。继续,我们对世界的心智模式必须适应新数据,其中一些包含新的维度,我们没有看到事情的新方法的概念。这些思维模式并不与表的模式,定义如何分类和处理新信息。

这给我们带来了模式管理。随着业务问题和需求的发展随着时间的推移,也会你的数据的结构。三角洲湖,随着数据的变化,结合新的维度是很容易的。用户获得简单的语义控制模式的表。这些工具包括模式执行,这可以防止用户不小心污染与错误的表或垃圾数据,以及模式演化,这使他们能够自动添加新列属于当这些丰富的数据列。在这个博客中,我们将深入的使用这些工具。

理解表模式

每个DataFrame Apache火花™包含一个模式,一个蓝图,它定义的形状数据,如数据类型和列,和元数据。三角洲湖,表的模式是JSON格式保存在内部事务日志。

执行模式是什么?

模式执行,也被称为模式验证,是三角洲湖的维护,确保数据质量拒绝写入一个表,表的模式不一致。像前台经理繁忙的餐厅只接受预订,它检查是否数据插入到表中每一列是在其预期的列表列(换句话说,是否每一个都有一个“预订”),并拒绝任何写列没有上榜。

执行模式是如何工作的呢?

三角洲湖使用模式验证在写,这意味着所有新写入表检查兼容性与目标表的模式写时间。如果模式不兼容,三角洲湖完全取消交易(没有数据写入),并提出了一个异常,让用户了解不匹配。

决定写一个表是否兼容,三角洲湖使用以下规则。DataFrame编写:

  • 不能包含任何额外的列不存在目标表的模式。相反的,没关系,如果传入的数据不包含表中的每一列,这些列将被分配null值。
  • 不能有不同的列数据类型的列的数据类型在目标表中。如果一个目标表的列包含StringType数据,但相应的列DataFrame包含IntegerType数据,模式的实施将引发一个异常,防止写操作。
  • 不能只包含列名不同的情况。这意味着您不能列如“Foo”和“Foo”定义在相同的表。当火花可用于区分大小写或不敏感(默认)模式下,三角洲湖case-preserving但不敏感当存储模式。拼花是大小写敏感的,当存储和返回列信息。为了避免潜在的错误,数据损坏或损失的问题(我们亲自经历过在砖),我们决定把这一限制。

为了说明这一点,看看下面的代码会发生什么当试图添加一些新计算列一套三角洲湖表,还没有接受它们。

#生成DataFrame贷款,我们会添加到我们的三角洲湖表< / span >贷款= sql (< / span >”“”< / span >选择addr_state,演员(兰德(10)*算作bigint)计数,< / span >铸造(兰德(10)* 10000 *算作双)数量< / span >从loan_by_state_delta< / span >”“”< / span >)< / span >#显示原始DataFrame的模式< / span >original_loans.printSchema ()”“”< / span >根< / span >|——addr_state:字符串(nullable = true)< / span >|——数:整数(nullable = true)< / span >”“”< / span >#显示新DataFrame的模式< / span >loans.printSchema ()”“”< / span >根< / span >|——addr_state:字符串(nullable = true)< / span >|——数:整数(nullable = true)< / span >|——数量:双(nullable = true) #新列< / span >”“”< / span >#尝试添加新DataFrame现有表(新列)< / span >loans.write。< / span >格式< / span >(< / span >“δ”< / span >)\< / span >.mode (< / span >“添加”< / span >)\< / span >。save (DELTALAKE_PATH)”“”返回:< / span >< span风格= "颜色:红色;" >< / span >模式不匹配时发现写作三角洲表。< / span >要启用模式迁移,请设置:< / span >”。选项(“mergeSchema”,“真正的”)\ '< / span >表模式:< / span >根< / span >——addr_state:字符串(nullable = true)< / span >——数:长(可空= true)< / span >数据模式:< / span >根< / span >——addr_state:字符串(nullable = true)< / span >——数:长(可空= true)< / span >——数量:双(nullable = true)< / span >如果启用了acl表,这些选项将被忽略。请使用ALTER TABLE命令改变模式。< / span >< / span >< / span >”“”< / span >

而不是自动添加新列,三角洲湖执行模式和停止写的发生。帮助确定哪些列(s)导致不匹配,火花打印出这两个堆栈跟踪模式的比较。

模式是如何执行有用吗?

因为它是这样一个严格的检查,执行模式是一个很好的工具使用干净的看门人,完全改变了数据集,准备生产或消费。通常执行表,直接饲料:

  • 机器学习算法
  • BI仪表板
  • 数据分析和可视化工具
  • 任何生产系统要求高度结构化,强类型、语义模式

为了他们的数据准备最后的障碍,许多用户使用一个简单的“种”架构,逐步补充道结构表。为了了BOB低频彩解更多,看看文章题为与三角洲湖Productionizing机器学习

当然,执行模式可以使用在你的管道,但请注意,这有点令人沮丧的流写入一个表失败,因为你忘了你单个列添加到输入数据,例如。

防止数据被稀释

在这一点上,你可能会问自己,有什么值得大惊小怪的?毕竟,有时一个意想不到的“模式不匹配”的错误可能会使您在您的工作流,特别是如果你新三角洲湖。为什么不让模式改变但是它需要这样我可以写DataFrame不管什么?

正如老话所说,“一盎司的预防胜过一磅的治疗。”At some point, if you don't enforce your schema, issues with data type compatibility will rear their ugly heads - seemingly homogenous sources of raw data can contain edge cases, corrupted columns, misformed mappings, or other scary things that go bump in the night. A much better approach is to stop these enemies at the gates - using schema enforcement - and deal with them in the daylight rather than later on, when they'll be lurking in the shadowy recesses of your production code.

模式的实施提供了内心的宁静,你的表的模式不会改变,除非你使肯定的选择改变它。它可以防止数据“稀释”,可以发生在新列如此频繁的附加,以前富有,简明表失去意义和实用性由于海量数据。通过鼓励你故意,设定高标准,并期望高质量、执行模式是做它是为了做什么——让你诚实的,和你的桌子干净。

在进一步审查,如果你真的决定做了想添加新列,这是一个很简单的,一线解决,下面讨论。解决方案模式演化!

模式演化是什么?

模式演化是一个功能,允许用户轻松地更改一个表的当前模式以适应随时间变化的数据。执行时最常见的,它是使用一个附加或覆盖操作,自动调整模式包括一个或更多的新列。

模式演化是如何工作的呢?

跟进从上一节的例子中,开发人员可以很容易地使用模式演化来添加新列,以前拒绝了由于模式不匹配。模式演化是通过添加激活.option (“mergeSchema”,“真正的”)到你的.write.writeStream火花命令。

#添加mergeSchema选项< / span >loans.write。< / span >格式< / span >(< / span >“δ”< / span >)\< / span >.option (< / span >“mergeSchema”< / span >,< / span >“真正的”< / span >)\< / span >.mode (< / span >“添加”< / span >)\< / span >。save (DELTALAKE_SILVER_PATH)

要查看情节,执行以下SQL语句的火花。

#< / span >创建< / span >一个阴谋< / span >与< / span >的< / span >新< / span >列< / span >来< / span >确认写成功< / span >%< / span >sql< / span >选择< / span >addr_state,< / span >总和< / span >(“金额”)< / span >作为< / span >量< / span >从< / span >loan_by_state_delta< / span >集团< / span >通过< / span >addr_state< / span >订单< / span >通过< / span >总和< / span >(“金额”)< / span >DESC< / span >限制< / span >10< / span >

条形图显示了每个国家的贷款数量成功使用模式后执法和模式演化。

此外,您可以设置该选项为整个火花会话通过添加火花配置spark.databricks.delta.schema.autoMerge = True。小心使用,因为模式的实施将不再提醒你是意想不到的模式不匹配。

通过包括mergeSchema查询选项,DataFrame中的任何列存在但不是目标表中自动添加到结束的模式写事务的一部分。嵌套也可以添加字段,这些字段会被添加到各自的struct列的结束。

数据工程师和科学家可以使用这个选项来添加新列(也许一个新指标跟踪,或本月的销售数字的列)现有的机器学习生产表在不破坏现有的模型依赖于旧的列。

以下类型的模式变化有资格获得模式演化期间表附加或覆盖:

  • 添加新列(这是最常见的场景)
  • 改变数据类型的NullType - >其他类型,或向上的ByteType - > ShortType - > IntegerType

其他的变化,没有资格获得模式演化,要求架构和数据被覆盖通过添加.option (“overwriteSchema”,“真正的”)。例如,在情况列“Foo”最初是一个整数数据类型和新模式将是一个字符串数据类型,那么所有的拼花(数据)文件需要重写。这些变化包括:

  • 删除列
  • 改变现有的列的数据类型(地方)
  • 重命名列名称,只有通过不同情况下(例如“Foo”和“Foo”)

最后,与即将发布的3.0火花,显式的DDL(使用ALTER TABLE)将完全支持,允许用户对表执行以下操作模式:

  • 添加列
  • 改变列的评论
  • 设置表的属性定义表的行为,例如设置事务日志的保留时间

模式演化是如何有用吗?

模式演化可以任何时候你使用意愿改变你的表的模式(而不是你不小心添加列DataFrame不应该有)。这是最简单的方法迁移你的模式,因为它自动添加正确的列名称和数据类型,而不需要显式地声明它们。

总结

模式执行拒绝任何新列或其他变化,不兼容你的表。通过设置和维护这些高标准,分析师和工程师可以信任他们的数据完整性的最高水平,并思考清晰,允许他们做出更好的业务决策。

在硬币的另一面,模式演化补充实施方便目的自动模式变化发生。毕竟,它不应该很难添加一列。

模式的实施是阴模式演化的阳。一起使用时,这些特性使它比以往更容易阻挡噪音,和调优的信号。

我们还要感谢成员Mukul没吃,Pranav Anand这个博客为他们的贡献。

对开源三角洲湖感兴趣吗?bob下载地址
访问在线三角洲湖中心要了解BOB低频彩更多,请下载最新的代码,并加入三角洲湖社区。

相关的

在本系列文章:
深入三角洲湖# 1:打开事务日志
深入三角洲湖# 2:进化模式执行&
深入三角洲湖# 3:DML内部(更新、删除、合并)

与三角洲湖Productionizing机器学习
湖是什么数据?

免费试着砖

相关的帖子

看到所有公司博客上的帖子