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

天翼云_中国万网域名注册_促销

小七 141 0

优化雪花数据库架构的技巧(第3部分)

优化雪花数据库架构的技巧(第3部分)2020年3月30日|6分钟读数作者:肯特·格拉齐亚诺如何使用雪花,雪花技术在我的datavault(DV)系列的最后一篇文章中,我将讨论雪花云数据平台的两个更酷的特性,您可以在我们的平台上构建DV时利用这些特性。如果您不熟悉DV方法,请在阅读本文之前阅读这篇介绍性博客文章和本系列文章的第1部分。本系列的第2部分描述了如何为最大并行加载设置DV。使用变量数据类型为了处理"大数据",更确切地说,半结构化数据,雪花发明了一种新的专有日期类型,我们称之为VARIANT。当使用此数据类型创建表中的列时,可以直接将JSON、AVRO、Parquet、XML和Orc类型的文档加载到表中,而无需转换或解析文档以适应固定模式。这样,我们就可以使用SQL在读时支持真正的模式。(要深入了解,请参阅本文和相关电子书或本次网络研讨会)。那么这如何适用于DV模型呢?几年前,DV方法的发明者danlinstedt问我如何利用这个特性。我的建议是简单地用它来保存卫星(Sat)表中的描述性信息。通常,Sat表有父集线器(或链接)的主键(PK)、加载日期时间戳(LDTS)、哈希差分列(dv2.0中的hash_DIFF)、记录源(RSRC),然后是一组属性,这些属性是与父对象相关的描述性信息图1:DV2.0模型和标准Sat定义我的建议是,如果数据源是一个JSON文档,我们可以这样对Sat进行建模:集线器键LDTS变体哈希差异RSCR将其应用于图1中的模型,修改后的模型将类似于图2中的模型。图2:Sats中使用变体的DV2.0模型使用这种方法,我们可以更灵活地将整个文档加载到Sat中,而不必将键解析到表中的单独列中。为什么这么好?假设有一个JSON文档,其中有100多个键。您做了一些发现,可以很容易地找到构成中心业务密钥的属性,但您还不知道所有其他属性的用途,而且实际上,最初的需求只要求文档中的五个属性,但你知道最终可能需要一些其他属性。你只是不知道是哪一个,或者什么时候。由于Snowflake的Read方面的模式,您不必预先知道所有的需求。您不必猜测并只加载最初的5个,因为您知道以后将被迫重新设计,您只需以一个变体将整个文档加载到Sat中。之后,当需求发生变化时,您已经加载了数据。这就是敏捷!但是如何公开JSON文档(现在存储在VARIANT列中)中的值供用户查询呢?构建业务Vault视图使用Snowflake SQL extensions for JSON,您可以在Sat上构建一个视图,以公开用户所需的属性。由于Snowflake优化了变量中数据的存储和组织,因此针对此类数据的查询具有很高的性能。自从我在Snowflake工作以来,许多雪花客户就一直在使用这种方法为报表和仪表板公开JSON数据。在DV术语中,任何建立在原始DV之上或之外的结构通常称为业务保险库(businessvault,BV)。BV的一个用途是构建应用于所有下游应用程序和报表的业务逻辑的对象。在这种情况下,业务逻辑只是公开和格式化业务用户要求的属性下面是一个可以编写的代码示例:创建或替换视图bizvault.vw_sat_零件(轮毂零件键,加载dts,制造商,品牌,零售价记录源作为与卫星一样(选择md5\U hub U部分,ldts,rsrc公司,属性,--这是变量列引线(ldts)(按md5\U hub U部分划分ORDER BY ldts)AS lead_dts--用于查找当前行从  rawvault.sat_零件)选择  sat.md5_hub_部分,  卫星ldts,周六属性:p_mfgr*字符串,周六属性:p峎U品牌*字符串,周六属性:p峎零售价●数字,  卫星rsrc从周六开始哪里lead_dts为空--仅获取当前行这种方法的优点是它非常敏捷,因为随着业务需求的发展,很容易更改视图以添加新的属性。这比重新设计DV表和修改然后测试转换过程以解析出新属性要少得多。此外,由于这是一个视图,因此可以对DV中的数据进行近乎实时的访问。如果您的数据管道不断地向DV提供数据,甚至执行微批处理,则每次针对该视图执行查询时,结果都将是最新的。如果您现在正在进行批处理,那么当您需要更频繁地加载时,这种方法是可以证明的。如果需求意味着BV视图需要更加复杂,并且您无法获得满足sla的查询,那么您始终可以选择将该视图转换为在未来迭代中手动刷新的持久表。从敏捷的角度来看,我总是建议客户首先使用视图来验证他们对业务用户的理解,从而在开发生命周期的早期向他们展示进度。只有当使用适当大小的雪花虚拟仓库无法满足SLA时,才考虑保存数据。在商业保险库上建立信息集市就像对BV对象使用视图一样,在Snowflake中构建完整DV架构的人也使用视图来构建信息集市和其他报告层类型的对象(是的,视图上的视图)同样的好处是更快地实现价值。视图很容易调整以适应新的需求,这使得团队能够更加敏捷,对业务用户做出更大的响应。如果您对数据集市有近乎实时的需求,那么视图也可以让您更接近于实现这一点。另一个优点是使用视图,您可以轻松地在DV/BV存储库上创建任何类型的投影。这意味着您可以为最终用户提供一组星型模式视图、第三种标准形式(3NF)(或虚拟操作数据存储[ODS])视图集,甚至可以为数据科学家提供一个广泛的非规范化视图。通过使用视图,您可以确保它们都在查看相同的数据!多表插入雪花的另一个很酷的特性是能够使用单个数据源同时加载多个表。这称为多表插入(MTI)。我在前面的介绍性博客文章中写到了这一点,但没有包括处理DV加载模式的变更数据捕获(CDC)方面的代码。下面是一个示例,说明如何从单级表加载集线器和Sat,同时使用散列-差异比较的DV 2.0方法只向集线器添加新记录,并向Sat添加新的或更改的记录。全部插入当(选择计数(*)从dv.hub_国家碳氢化合物在哪里hc.hub U国家/地区密钥= stg.hash_密钥)=0那么进入dv.hub_国家(hub_country_key,country_abrv,hub_load_dts,集线器(集线器)价值观(stg.hash_密钥, stg.country_缩写, stg.负荷, stg.rec_src段)  当(选择计数(*)从dv.sat_国家sc公司在哪里sc.hub U国家/地区= stg.hash_密钥 以及散列差异=MD5(国家名称))=0那么进入dv.sat_国家(集线器国家/地区密钥,卫星/负载数据hash_diff,sat_rec_src,国家/地区名称)价值观(stg.hash_密钥, stg.负荷,                           stg.hash_diff段,  stg.rec_src段, stg.国家/地区名称)  选择MD5(country_abrv)作为散列键乡村缩写国家名称,MD5(国家/地区名称)为hash_diff当前的"加载"时间戳阶段\u rec \u src AS rec \u src从舞台.国家stgMTI语句中的第一个WHEN子句检查目标Hub和Sat表(在本例中为Hub_COUNTRY和Sat_COUNTRIES)中是否存在与在舞台.国家表。如果暂存数据确实包含新的国家/地区记录,并将导致新的中心记录,则COUNT(*)将返回零(0),因为中心中还不存在密钥。类似地,第二个WHEN检查Sat中是否已经存在该集线器的记录,以及它是否包含相同的数据(在这种情况下,HASH_DIFF将匹配)。同样,零(0)计数意味着记录不存在,因此需要插入新的Sat记录,或者阶段表中的数据与DV中已有的记录不同,因此需要插入新版本的记录。因此,如果计数为零,则将插入一个新记录DV.SAT_国家否则第二次跳过那个记录。使用这种方法,即使重新启动加载,或者两次获取相同的数据,也永远不会将副本加载到集线器或Sat中。很酷,对吧?(技术上称之为幂等载荷。)结论好吧,这就是本系列关于使用DV和雪花云数据平台的文章。在过去的一年里,我和许多正在寻找