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

企业网站_分布式服务器_怎么买

小七 141 0

大规模合成数据生成(三)

大规模合成数据生成(三)2020年5月13日|7分钟读取作者:迈克·沃顿雪花技术在本系列的第一部分中,我尊敬的同事robertfehrmann演示了如何使用标准SQL语句在雪花中创建大量数据。在本系列的第二部分中,他继续开发一个Python脚本,该脚本利用标准化规范自动创建那些SQL语句。这些脚本和文档可以在这里找到。我最近在一个项目中工作,这个项目需要准确地表示客户的现有数据,以便测试他们当前的架构和提议的变更之间的总体成本差异。环境由2000多张大小不一的表组成,我无法直接访问这些表。我需要一种方法来生成精确的统计数据,插入到Robert的电子表格中,然后我将使用它在不同的Snowflake帐户上生成SQL语句。我突然意识到,使用Python和一个同时完成这两项工作的笔记本电脑,可以减轻客户生成统计数据以及将这些数字插入模板的工作量。这篇文章将提供我创建的Python的高层次概述。这款笔记本可以在GitHub上找到,它是基于googlecolaboratorial(Colab)构建的。对于那些以前没有使用过它的人,Colab免费提供了一个托管的Python笔记本环境。您可以直接从Colab的接口加载GitHub.ipynb文件。动态数据生成器笔记本笔记本将引导您完成以下代码:安装笔记本中Python代码所需的正确库的代码。请注意,这对于在Colab这样的工具中运行是必要的,但是如果您使用自己的Jupyter或其他iPython环境,您只需执行一次就可以完成设置。为源帐户(要从中复制数据的系统)和目标帐户(要在其中生成数据的系统)设置连接变量的代码笔记本包括四个功能。第一个函数是getEngine(),它只是根据步骤2中设置的变量创建一个SQLAlchemy引擎。第二个函数是execSQLDataFrame(),它执行传递给它的任何SQL,并将数据作为Pandas DataFrame返回。其他两个函数execColStats()和execGenDataSQL()将在下面进一步详细介绍。主单元格,在源帐户上为模式中的每个表执行函数。execColStats()函数此函数根据每个字段的数据类型从源表生成统计信息。函数的输入是一个包含表的所有列信息的DataFrame,它来自以下SQL:选择*根据信息_架构.列其中table_name='"""+str(dfTables.name[i] )+"""'和表"schema='""+sourceSchema+"""""数据类型不在('VARIANT','ARRAY')按顺序排列;由于不同的数据类型需要不同的统计信息,因此我创建了下表来显示除了表名、列名和数据类型字段之外,此函数中的代码还生成了什么:注意,Robert的代码目前不处理在目标端生成数组或变量值。笔记本会过滤掉数组和变量列以避免被计算,最终它们将被填充空值。这个函数的输出是这些统计信息的一个数据帧,execGenDataSQL()函数可以使用它来生成Robert的数据生成SQL语句。execGenDataSQL()函数此函数利用execColStats()中的DataFrame创建必要的SQL语句,该语句使用Robert的代码动态生成数据。Robert的代码对这个笔记本最大的修改是SQL语句是一个INSERT语句,而不是CREATE TABLE AS SELECT,因为笔记本的主单元格将提前为您生成表,如果它不存在,使用源系统的实际数据定义语言(DDL)。我发现这是创建表的更准确的方法。这个函数的输出是一个字符串形式的SQL语句,然后在笔记本底部的主单元格中使用。主电池对于指定架构中的每个表,将执行以下代码。代码执行本文前面引用的代码,以创建dfColumns数据帧。创建数据帧后,它将被传递到execColStats()以生成包含生成SQL查询所需信息的dfStats数据帧。dfStats被发送到execGenDataSQL()(如上所述)以创建可执行的sqlQuery。在执行sqlQuery之前,将检查目标以查看表是否存在。如果表不存在,代码将对源运行get-u ddl()语句,以在目标上生成表。以下代码仅供参考:dfColumns=execSQLDataFrame(SourceEngine,sqlQuery) 如果dfColumns.shape[0]!=0:dfStats=execolstats(dfColumns,str(dfTables.rows[i] ))sqlQuery=execGenDataSQL(dfStats)sqlCheckQuery="""选择表名根据信息_schema.tables模式在哪里表名='"""+dfTables.name[i] +"""'和表\u catalog='"""+targetDatabase+"""';""target_check=execSQLDataFrame(TargetEngine,sqlCheckQuery) 如果目标_检查形状[0]!=0:输出=execSQLDataFrame(TargetEngine,sqlQuery)其他:target_ddl_sql="""选择get_ddl('表','"""+dfTables.name[i] +"""')作为ctas;"""target\uddl=execSQLDataFrame(SourceEngine,target\uddl_sql)execSQLDataFrame(目标引擎,目标_ddl.CTA公司[0])输出=execSQLDataFrame(TargetEngine,sqlQuery)但是,关于get_ddl()函数,有一些事情需要注意,这可能会导致问题。首先,如果表定义对目标上不存在的表有约束,DDL将失败。其次,如果表定义包含撇号的注释,DDL将失败。对于这两种情况,必须在目标上手动生成表。笔记本中包括一个位于最底部的可选单元格,它允许将sqlQuery打印到笔记本上,而不是直接执行。这允许您在手动创建表之后手动执行INSERT语句。摘要如果您发现自己正在尝试生成与现有雪花数据库非常相似的随机数据,则本文档中引用的笔记本将帮助您复制源架构并使用随机数据创建新的目标架构。它利用了Robert的数据生成器的一个稍作修改的版本,但它跳过了生成统计数据的过程,在CSV或Excel电子表格中收集统计数据,然后使用这些信息生成SQL语句。相反,它会为您生成这些统计信息,直接利用它们来创建SQL语句,然后在新的目标模式上为您执行这些统计信息。对于我工作过的客户,这个过程为我们节省了许多天的执行、收集和处理统计数据,以便生成随机数据。就像你读的?通过喜欢和分享来表达你的感激之情!Facebook推特LinkedIn