学习SQL并掌握以成为数据工程师的途径

2020-11-29 01:56:10

SQL是数据工程师用来建模业务逻辑,提取关键性能指标以及创建可重用数据结构的关键工具之一。但是,数据工程师需要考虑不同类型的SQL:基本,高级建模,高效,大数据和程序化。学习SQL的途径涉及逐步学习这些不同的类型。

学习“ Basic SQL”就是关于学习SQL中的关键操作以操纵诸如聚合,粒度和联接之类的数据。

可以从W3C之类的网站学习基本SQL,也可以从Datacamp或DataQuest之类的网站中寻找更实用的学习方法。这些网站使我们可以很好地掌握SQL的核心概念,例如不同的操作,函数,子查询和联接。数据工程中的某些核心概念(例如处理表/数据集的粒度)通常没有得到应有的重视。

学习SQL的主要挑战之一是建立数据库和访问数据集。这些天来安装本地数据库变得非常容易,但是确实需要一些时间来设置数据库。之后,需要创建表,并将数据集上载到表中,然后才能用于实践学习。

通常在筛选面试问题(例如直方图)时测试此类知识,以了解候选人如何掌握诸如粒度或联接之类的概念。这种面试问题也是针对即将从事数据工程师职业的应届毕业生所期望的典型SQL知识水平。

数据工程师需要能够为复杂的转换建模。学习一些高级分析SQL有助于对这些类型的行为进行建模。有两点主要帮助支持这种用例:1)高级查询2)数据模型。

窗口函数是一类特殊的具有添加属性的函数。它们有助于更轻松地定义否则需要混合子查询和联接才能获得相同结果的转换。它们可以帮助处理许多较重的数据转换,例如会话化,首选项选择或基于实际数据的优化。

与常规LIKE运算符相比,REGEXP及其相关功能提供了一种进行更广泛的文本模式匹配的方法。

集合聚合函数,允许汇总其中包含的数据集,典型的函数是LISTAGG和array_agg。它们对于提供某些数据可能很有用,这些数据自然比汇总数据集更细化。例如,以了解特定产品类型是否包含在给定的电子商务订单中的用例为例。这可以从原始订单商品数据中计算得出,但是也可以非常容易地从具有基于jsonb_object_agg的聚合字段的订单表中计算出来。

递归CTE /层次结构查询通常比其他类型的转换(如窗口函数/正则表达式或集合聚合函数)少用。但是,它们对于解决某些类型的问题至关重要。

数据模型,即所使用的数据模型的类型可能会特别具有影响力。三种

规范形式:对于数据工程师来说,了解数据库规范化的好处,不同的规范形式的含义以及应在何处使用非常重要。

缓慢变化的维度:设置并利用II型缓慢变化的维度(SCD)表可以使处理某些用例特别容易,例如计算演变,例如给定保险合同的整个时间的保险费。 I型SDC表将更适合于提供按年龄段划分的当前用户人口统计信息。

非规范化设计:非规范化是数据倾向于在数据仓库中公开的典型方式,了解非规范化设计中使用的预请求和不同方法(例如星型和雪花模式)对于保持理智的数据仓库很重要。

数据库的官方文档是高级分析SQL的关键学习材料之一。在需要对业务问题进行建模时,必须了解可用的内容和可能感兴趣的内容。一些书还很好地概述了如何将SQL最好地应用于这些建模用例,例如,实践Oracle SQL,它为窗口函数提供了实用的应用程序,提供了递归查询的示例,或处理了行模式匹配。

对于数据模型,有几个数据库类[1] [2] [3]讲授一些关键的建模原理。这些需要在实践中应用。诸如为仅有的人建立业务信息建模或数据库设计之类的书为深入研究该主题提供了有用的参考。

有关高级建模的问题往往会在访谈中提出,例如作为SQL案例研究的一部分,例如针对给定的特定用例设计表结构和转换,或者可以更具理论性,例如解释标准格式版本之间的差异。 。

成为数据工程师的一部分工作是编写高效的代码。在这方面需要了解一些重要的事情。 1)对复杂性有很好的了解2)对数据结构,有效的数据模型和查询模式有很好的理解,以及3)能够分析和解释计划并了解优化程序正在执行的操作

此外,对某些方法的一般知识特别昂贵,例如使用相关子查询;数据工程师必须以幼稚的方式以及通过数据库优化的方式了解完成的不同转换的时间和空间复杂性。

了解索引和分区等概念,以及它们如何有助于提高效率以及围绕它们进行建模如何带来好处。以每日快照表为例-这可能是支持实体的更新过程的一种好方法,它利用前一天的分区并将修改应用到顶部。

从客户端更新CU WHERE cu.ds ='2020-02-02'的daily_updates AS(选择customer_id,名称,created_on,ROW_NUMBER()OVER(PARTITION BY customer_id ORDER BY created_on DESC))插入到dim_user SELECT'2020-01 -02'AS ds,COALESCE(daily.customer_id,du.customer_id)AS customer_id,COALESCE(daily.name,du.name)AS名称,COALESCE(daily.created_on,du.last_login_on)AS last_login_on来自dim_user du FULL OUTER JOIN daily_updates每天在du.customer_id = daily.customer_id AND daily.rn = 1处更新du.ds ='2020-01-01'

让我们看一下上面的SQL查询,其中ds代表每日分区。该过程每天进行一次,以利用一个完整的外部联接和相同粒度(即customer_id)的CTE(已过滤,即rn = 1)来更新到不同的分区。可以仅查看当时的一部分数据(每日更新的数据以及已经合并的客户视图)来计算更新,这比每次根据完整更新日志重新计算客户的状态要高效得多。

处理数据库时,必须了解如何阅读解释计划。它告诉您优化器已做出的决定以及正在执行的不同步骤。这使数据工程师能够查看哪些操作昂贵并且可以进行优化。例如,当它应该是哈希联接时,就会发生嵌套循环操作的使用。

有多种方法可根据解释计划返回的内容来优化查询,并且解释计划的分析应与这些优化技术联系在一起,例如1)查询重写2)引入索引,预排序步骤,分区…3 )使用优化程序/计划程序提示4)更新表统计信息。

学习如何编写高效的SQL代码的最典型方法是面对效率低下或运行缓慢的操作,并在必要时对其进行优化。有一些关于数据库的书籍和课程可提供一些学习信息,例如在线学习平台上的此类文章,这些文章提供了有关如何编写更有效的SQL的见解。但是,最重要的信息来源之一是阅读官方数据库文档并从经验中学习。

对于有经验的候选人,面试中通常会出现效率问题。他们通常会作为建模练习的后续问题,询问如何使转换更加有效。但是,某些公司将重点放在编写高效的代码和查询优化上。对于这些类型的采访,不仅要了解所提到的某些方法,而且要真正了解幕后发生的事情以及优化器如何实际重写查询顶部以使其更加高效(例如扁平化,内联,谓词下推,分区修剪...

处理大数据SQL涉及一些特殊性。某些数据结构选项(例如存储桶或群集依据)对于大数据技术而言是非常传统的。

尽管某些功能在传统数据库中可用,但某些功能中使用概率数据结构(例如presto中的rox_distinct)也是在利用大数据技术的SQL代码中通常发现的东西。

处理大数据SQL的许多方面是了解特定分布式系统中幕后发生的事情,类似于系统如何计划和执行查询。

学习大数据的很多知识来自于使用大数据系统并尝试调试正在发生的事情。使用的平台的特定文档,例如Spark或Hive,将提供正在发生的事情的高级视图。诸如哈佛大学大数据算法之类的课程更深入地解释了大数据中使用的某些概率算法和数据结构的内幕。

程序化SQL提供了一种通过过程来协调事务流的方法。它提供了编程语言的核心,引入了控制流(循环,if,…),变量,异常处理,甚至动态生成和执行SQL查询。

尽管程序化SQL的使用在某些现代数据工程运动中变得有些不利,这些运动赞成数据不变性和完全重载与增量更新,以及工作流引擎(如Airflow或Prefect)的兴起,但它仍然有用并在许多公司中使用。

大多数RDBMS支持多种编程SQL,例如用于MsSQL的T-SQL,用于Oracle的PL / SQL或用于Postgres的PL / pgSQL,因此该语言在很大程度上取决于供应商。

特定供应商提供的文档为尝试使用过程语言或专门搜索某些功能提供了良好的第一步。但是,有一些不错的书籍可以介绍这些语言,例如Oracle PL / SQL编程或PostgreSQL服务器编程。

以我的经验,编程的SQL问题通常不会在面试中直接问到,部分原因是该语言的供应商特殊性。但是,某些寻找具有特定数据库供应商经验的人员的公司可能会要求完成一些自动化测试,其中包括一些有关编程SQL的问题。