皇冠国际娱乐平台登录

首页 > 正文

【译】用SQL统一所有:一种有效的、语法惯用的流和表管理方法

www.sitedosisu.com2019-07-28
皇冠国际开户官网 ?

  现在还没有一个统一的流式SQL语法标准,各家都在做我自己的。本文提出了一种基于某些行业应用的统一SQL语法。 Spark也存在这个问题,社区版本在流式SQL方面一直很慢。 EMRSpark在今年上半年提供了自己的流式SQL支持版本,并将在后续更新中整合并支持这些出色的设计建议。

原文:

OneSQLtorulethemall:有效和合理的方法接近流量管理和表格。标题,SIGMOD'19

在数据处理方面,似乎最终将返回SQL!今天选择的本文作者来自ApacheBeam,ApacheCalcite和ApacheFlink专家,他们解释了他们构建流式SQL接口的经验。最后,编译了SQL标准的一些扩展建议。

Thethesisofthispaper,supportedbyexperiencedevelopinglargeopen-sourceframeworkssupportingreal-worldstreamingusecases,isthattheSQLlanguageandrelationalmodelas-isandwithminornon-intrusiveextensions,canbeveryeffectiveformanipulationofstreamingdata。

本文的论点是,在使用大规模开源框架开发真实世界流媒体场景以解决现实世界的经验下,SQL语言和关系模型对于当前和非流后的流数据操作非常有效。侵入式扩展。

本文中的许多想法已在ApacheBeam,ApacheCalcite和ApacheFlink中实现,或作为众多选项之一实现。 StreamingSQL已经在阿里巴巴,华为,Lyft,优步等公司使用。以下是他们的一些反馈,供您做出此选择:

开发和应用程序成本远低于非声明性流处理API。

熟悉SQL使得开发应用程序比非标准化查询语言更容易。

常见的窗口聚合和连接处理任务。基于事件时间的高效表达和更高效的执行。

当发生应用程序错误或服务中断时,使用相同的查询语句来处理存储在记录中的数据是很方便的。

组合,tablesandstreamscoverthecriticalspectrumofbusinessoperationsrangingfromstrategicdecisionmakingsupportedbyhistoricaldatatonear-andreal-timedatausedininteractiveanalysis . Webelieve,basedonourexperienceandnearlytwodecadesofresearchonstreamingSQLextensions,thatusingthesameSQLsemanticsinaconsistentmannerisaproductiveandelegantwaytounifythesetwomodalitiesofdata .

通常,表格和流程涵盖业务运营的关键领域,从历史数据支持的战略决策到交互式分析中使用的近实时数据。我们相信,根据我们的经验和近20年的流式SQL扩展研究,以一致的方式使用相同的SQL语义是统一这两种数据模式的有效而优雅的方法。

正如作者所指出的那样,许多以前的工作在过去多年中已经开展,其中很多都是从文章中借来的。最重要的是,它们基于使用ApacheFlink,Beam和Calcite的经验教训。

与传统的关系视图相比,流应用程序具有更多的时间概念。注意,在用户多个查询中,可变数据表实际上是时变表,即时变关系(TVR)。换句话说,任何查询结果仅代表该时间点的表数据。

Atime-varyingrelationisexactlywhatthenameImplies: arelationshipwhosecontentsmayvaryovertime . theinsinsight,声明,但在利用前工作,是thewhatstreamsandtablesaretworepresentationsforonesemanticobject。

时变表就像它的名字一样:表的数据内容可能会随时间而变化。在以前的工作中,指出但未充分利用的观点是流和表是语义对象的两种表示。

根据定义,TVR支持所有关系操作,即使在涉及时变关系数据的场景中也是如此。所以文章中的第一个建议实际上是无操作!因此,让我们使用它们并明确表示SQL正在TVR上运行。

我们确实需要做一些扩展来支持事件时间。特别是,我们需要仔细区分事件时间和处理时间。我们还需要了解事件不一定按时间顺序呈现。

Weproposetosupporteventtimesemanticsviatwoconcepts: expliciteventtimestampsandwatermarks.Together,theallowallowcorrecteventtimecalculation,suchasgroupingininterintervals(orwindows)oftimetime,tobeeffectivelyexpressedandcarriedoutoutoutoutoutoutumingnoundedingourcesources。

我们建议通过两个概念来支持事件时间语义:显式时间戳和水印。两者的组合可以正确地支持事件时间计算,例如按时间窗口分组,从而可以在不消耗大量资源的情况下有效地表达和计算它。

水印可以追溯到Millwheel,GoogleCloudDataflow和ApacheBeamandApacheFlink。在处理时间的每个点处,水印确定时间戳,该时间戳确定处理时的事件完整性的时间限制。

本文的第三部分描述了如何控制关系数据的呈现方式以及何时实现关系数据。例如,查询结果会立即更新以反映输入的任何新数据,或者在时间窗口结束时显示完整的数据更新。

NEXmark(用于流式查询的标记)Query7实现了用于监控拍卖中价格最高的项目的逻辑。每隔10分钟,查询将返回最高出价和关联的itemid。

下图显示了如何使用StreamingSQL来表达它。我没有过多地描述业务逻辑,但我对查询本身进行了评论。我希望这足以让你理解这一点。

输入以下数据:

当您在8:21查询时,您将获得以下TVR:

但如果您在8:13查询,结果会有所不同:

请注意,正如当前所表达的那样,查询返回时间点结果,但如果我们愿意,我们可以使用物化延迟来更改结果的显示方式。例如,“SELECT . EMITAFTERWATERMARK;”,只有当水印到达时间窗口的末尾时才会更新查询结果。

所以,在8:16,我们将看到:

然后在8:21,你会看到:

如果你想看到没有水印的窗口行,但只要你得到一个周期性的局和结果,我们就可以使用“SELECT . EMITSTREAMAFTERDELAY”(这里STREAM意味着我们想要以流方式显示查询结果)。

我希望这能帮到您。目前,该建议包括对标准SQL的七个扩展:

Watermarkedeventtimecolumn:TIMESTAMP类型的列,在关系表中带有水印。水印由系统维护。

Groupingoneventtimestamps:当“GroupBy”子句应用于时间列时,仅包括其键小于时间列定义的水印的那些组。

事件时间窗口功能:以翻滚和跳跃开始。参数包括数据表和时间列描述符,返回添加了时间列的数据表。滚动产生具有相等间距的不相交窗口,并且Hop产生相等大小的滑动窗口。

Streammaterialization:“EMITSTREAM”生成一个与传统查询结果不同的时变结果表。添加新列以指示数据行是否是前一行的调用,该行的日志更新处理时间偏移以及相对于相同事件时间分组的其他更新的序列号。

Materializationdelay:当查询具有“EMITAFTERWATERMARK”修饰符时,将仅实现完整的结果行。

Periodicmaterialization:当查询具有“EMITAFTERDELAYd”修饰符时,查询结果将输出d个周期。

Combinedmaterializationdelay:当查询具有修饰符“EMITAFTERDELAYdANDAFTERWATERMARK”时,只有在间隔为d且数据完成时才会输出查询结果。

3.1例子

3.2EmitStream示例

本文的第5部分列出了从ApacheCalcite,Flink和Beam中学到的经验教训,它们为设计提供了参考。我没有足够的时间逐一介绍。以下节点对我更有吸引力:

因为事件时间戳只是一个常规属性并且可以在正常表达式中引用,所以表达式的结果可能与水印不一致,水印需要在查询计划中考虑。

用户发现很难推断出查询中事件时间的最佳使用,这可能导致使用不满意的语义执行计划。

对我来说,让我印象深刻的是尽可能少地改变目标。文章的“未来工作”部分表明,文章中提出的扩展需要进一步改进。

例如,我注意到SQL标准定义指出SQL查询中的时间是查询的时间点(当前时间或“ASOFSYSTEMTIME”指定的时间)。这意味着您无法在流尾部表达视图(您可以使用类似“CURRENT_TIME-INTERVAL'1'HOUR”的表达式,但在执行查询时,“CURRENT_TIME”采用固定值)。

作者:带猫的鱼

阅读原文

本文是云栖社区的原创内容,未经许可,不得转载。

热门浏览
热门排行榜
热门标签
日期归档