粉丝1347获赞2055

离线数仓开发用 spark 还是用 have circle? 这个问题呢?是一个星球球友提出来的,相信对于很多做数仓开发的小伙伴来说,是一个大家比较关心的问题。对于当前大数据背景下的数据仓库建设来说, 汉武几乎已经成为离线速仓的标准解决方案之一。汉武最大的特点在于它可以依赖 h d f s 这个分布式文件系统 能够无限横向扩展的存储能力来存储海量的离线数据。而且对于这部分存储的数据来说呢,他不像其他的普通查询数据库,只要你不对其中的数据进行分析, 它几乎不占用任何 c p u 和内存资源。对于汉武来说啊,你既可以把它当成一个 o l a a p 工具,用 have circle 对其中的数据进行数据分析,也可以把它作为一个带有表结构的数据员,用额外的计算引擎对存储在其中的数据进行分析计算,比如 spark。 既然这两种方案都能够达到对数据分析的目的, 那么作为开发者该如何选择呢?我们先来看 have circle, 这种应该是当下最简单的输仓开发方式了。对于 have 来说呢,优点是它天然就提供了 circle 语法以及对应的默认计算引擎。 开发人员只需要根据业务需要针对特定的表来编写对应的收口,就可以达到业务开发的目的。他对于开发人员的能力要求最低,普次性也最广。但是呢,这种单纯的 收口开发方式缺点也很明显。第一个,他屏蔽了大量的数据底层处理原理和计算逻辑,对于开发人员来说,上手难度虽然小,但是对于你的技能拓展来说是不利的。 第二个,你所有的计算都只能围绕在 have 内部进行数据从 have 中读取,计算结果呢,也只能写到 have 表中。 对于要求更高的业务来说,比如你要把计算结果写入到其他数据库, have 是做不到的,在使用上有比较大的局限性。第三个呢, have circle 虽然也很强大,支持各种的 udf, 但是对于一些更为复杂的计算场景来说,比如在我的大数据项目中,对于汉务表中的 ip 之短,我如 如果想要关联存储在 readys 中对应的地理位置信息,单纯用 have circle 就很难做到,所以他无法满足跨不同数据库的数据处理场景。而如果用 spark 的话,以上描述的三个缺点啊,全都能解决。 spark 通过读取悍马作为数据员最大的优势之一在于提供了自由度更高的数据计算方式, 它不仅可以用折扣的方式对数据进行处理,还可以用算字对数据进行更细力度的计算。而且像刚才提到的,如果在数据处理过程中需要读取第三方数据库 redis 的话, 它可以通过编写相应的连接 radis 代码,很轻易的就能做到。而且只要你愿意, circo 跟算子的计算方式还可以在同一个 spa 程序 同时使用。其次呢,以我的项目经验来看, spark 可以做任何跟数据相关的复杂计算,只有你想不到,没有他办不到。再一个呢, spark 兼容的生态非常的广,你读取 hot 的数据,经过各种计算之后, 最后想把结果存储到任何地方都可以,非常的灵活。当然用 spa 做数据计算也是有缺点的。首先呢,他增加了系统的复杂度,毕竟多了一个技术组建嘛, 而且对于开发人员的能力要求也会更高。这个东西啊,如果用不好,不但提高不了系统效率,还可能让你的系统变得更加的不稳定。最后,至于这两者该如何选择,就看你如何去取舍了。

这个 c q 来自于麦 c q 官网,在我看来,写这个 c q 语句的人相当有水平。我们先来看这样一个场景,假如要统计这个表里面日方为量,我们正常的做法是不是把这个日给去重掉,然后再使用炕头。 但是你来看 my sql 官网的这个语句,它这里巧妙地运用了两个函数,一个是 b 的 con, 一个是 b 的 word, 就 达到了这种驱虫加统计的效果。这里如果你不了解这个函数,那么我给你简单介绍一下。首先是 b 的 con, 它统计的是二进制种一的数量。假如有这么一个二进制一零一,那么使用 b 的 con 得到的结果就是一个二, 它统计里面一有多少个比特沃。它大概的意思是这样的,只要是参与运算的二进之中有一,那么它返回的就是一。假如一零一一,这个它返回的也是一,叫一零一, 那么它返回的是一。下面来看一下这个效果,可以看到两个 c q, 它们的运行结果是一样的,但是如果要比一个技术的高低,那么我觉得 my c q 给的这个例子,它的这个水平会更高。

哈喽,大家好,今天我们接着啊,前面的内容开始往后讲,那么在上一期的内容当中呢,我们讲到了日期函数里面的啊,一部分讲了跟着 data, 这是 i 和跟着地府, 我们今天我们接着往后讲,今天讲什么呢?今天讲这个 party 和我们的这个啊,卡外尔的这个,呃,及格式化的这个函数,第一个我们的这是 party, 它是干嘛用的呢?它里面有两个参数,这第一个是 party, 这个是 ctrl, 它是获取 日期中的某一部分或者日期中的某一部分。第一个怕的,什么意思呢?怕的啊,这个跟我们这个是一样的哈,嗯,年月日啊,十分秒,年月日十分秒,然后第二 data 呢?就是指定指定的这个日期哦,怎么用呢? selector, 然后呢? day turn part, 我们要获取什么呢?获取年份, 获取年份,然后呢?我们后面是 gature, 我们要获取当前日期的啊,这个年份,比如说我们来看一下,得到的是二零二零二二,然后呢?这个是年份 年份,然后呢我们可以拿到什么呢?年月日月,把它改成貌似, 然后呢?然后呢?还有我们的什么呢?月份日时分秒年月日对时奥尔分 年月日年月日年月,我们这个五七 十小时分钟,然后这个是秒数秒秒数,然后我们来看一下这个界面, 得到了,就是二零二二年五月二十七号零时五分五十二秒,那么这个时候 我们的这个叫什么呢?叫做啊,对,他怕的,他是获取我们的这个啊,一部分就是获取你这个啊,时间当中的一部分。那么有了这个时候我们可以做什么呢?我们可以去在查询条件中, 在查询条件中去根据年份 分子啊,统计之类的操作,分子统计之类的操作就是我可以查到某一年的所有的数据, 我就不用去赖,不用去转换这个,然后用 nike 去查找什么,什么什么,我可以得到所有的,就是你的数据里面所有年份的这个啊,这个数据。那比如 说什么呢?比如我们讲一个啊,简单的例子,比如说在这个例子当中,现在呢?现在呢?我已知数据表,已知我的这个数据表,已知我的这个数据表里面有这些数据,商品编号、品类编号、 品牌编号和创建时间,我们以这个创建时间为例,我可以得到什么呢?我可以得到这个这个数据当中 都有哪些年份就都有哪些年份,有有有这个产品的这个啊,产品的这个啊产生,比如说啊,这一圈 趴着,我要得到什么呢?我要得到这个,呃,年份耶,然后呢? 可谓是这个词儿容,我的这个,嗯,叫做 plod down ever, 把这个拿到这边来哈,放到这里来去去去看,然后它我们来看一下,在这个表单中, 你看零九,我们可以把它做再做一个 distinct 的,这个 distinct 还记得吧?去重复, ok, 你看二零二一二二二一九二零。那么这个就是我们可以得到什么呢?我们可以得到这个,用这个爱的帕特去 在我的实际查询当中去把它当做查询调解。那么同样我可以得到什么呢?有了它之后我可以去分组统计,统计,分个组 啊,这个每一年当中的商品总数量,商品数量, 他 groupie, groupie 什么呢?这是 partyear 每一年的这个商品总数量,那么这个时候那我就可以得到什么呢?这个叫什么呢?嗯嗯,年份 年份商品商品数量,年份商品数量。哦,就这样我就可以得到了 年份每一年的商品数量有哪些?有多少个?少?有多少个商品数量。那么这个就是我们把这个函数学完成我们的呃,指定的这个,呃查询条件当中去使用我的这些去 使用我的这些函数啊,他是可以运用的,他是可以使用的,我们都可以,比如说我还可以查找啊,某一年,某一月份,然后这样去这样去做啊,这个我们就查一个实际案例,是吧?实际使用,实际使用场景,实际使用场景距离 有了这个之后呢啊,我们就可以还可以得到什么呢?呃,就是比如说我们还可以去查询哦,某一月份按照月份去分组,某年的某月啊,这样去分组都是可以使用这些啊,这些使用产品我们会在后面的实际的案例当中呢去讲解。嗯, 接下来我们还是讲一个什么呢?这样讲解一个我们的这个叫什么呢?叫嗯, cover convert 呀,他是干什么呢?他这个还是他就他就比较比较常用了,就是他转换 come, 转换日期格式, 将这个日期日期格式化的格式化的函数,将我们将将 我们的日期转换成我们需要的模式。那么比如说我的这个叫什么? 给扯给扯,那我就跟着跟着他,他摸的是这个时间格式,那,那看起来,比如说有的人啊,他可能需求里面他就要 就是中文的,我这个多少年,多少月,多少日,多少多少分,这样的一个,这样的一个数据,我就要得到。那么我们怎么样去得到这样的一个数据呢?我们就讲几个啊,常用的啊。第一个他的语法是什么呢? cover 他的语法, 他里面,他里面呢?有,他里面呢?有三个孩子。第一个是 detro detour type, detour type, 那第二个是就是 express, 就是你要转换的这个啊,这个,这个这个数据,然后呢就是他的一个 style, 后面这个时代就是你要转把它转换成什么样的风格,转换成什么样的格式,那么这个时代时代他有很多种,很多种类别,那么我们就讲几个常用的,就讲几个常用的,比如说我们要做什么呢?第一个 看沃尔特,我们要把它转换成 卡外特,是来到卡外特,然后呢?嗯,外卡,我们要把这个日期转换成哦,给他设置一个支付刷五十。 然后呢 hj 尺转换成什么呢?第一个他的一个编码,这个是带有,他是一个编码,我们记记几个常用的一个编码。第一个我们最常用的一个啊,幺零幺编码,他是什么呢?我们来看一下幺零幺编码的 是什么?哦,他是这样的,他是这样的一个啊,月日连这样的一个格式。幺零幺编码,是啊,幺零幺编码, 月日年月日年。然后呢?第二个我们要看到的要讲到的是,呃,幺幺二返回,幺幺二返回什么呢? 幺幺二返回无符号的日期。纯数字返回无符号的纯数字日期。纯数字日期。那我们来看一下,你看 二零二二年五月二十七号,就是他没有无符号吗?无符号就是他这个年月日呃之间呢?没有任何符号去给他做一个分割。这第二个,第三个我们要讲的是 二十三,二十三得的是短日期, 短日期。然后呢?啊?然后呢?我们这个叫什么呢?嗯,幺零八得到的是什么呢?得到的是这个啊,就是时间。得到的是时间, 得到的就是一个时间。然后呢?啊?下面一个最后一个,最后加一个时间有点超时了,然后这个是二十,二十得到的是什么?这个得到就 就是我们的年月日十分秒的这样的一个格式。他跟什么呢?他跟我们的这个啊, getteeter 有点相似,但是呢他没有后面那个好秒数,没有后面那个好秒数。那么我们来看一下, 我们可以得到什么呢?哦,得到这些,得到这些纸,他还有一个,还有一个,我记得好像是啊,二十一,二十一是什么来着? 嗯嗯,他本来是这样的一个年月日式分秒这样的一个一个格式。这个就是我们的,我们的这个常用的这个啊,卡味特。

sequel 查询始终从 select 开始。案例,希望将原数据表格之中数据,通过 sequel 查询将数据全部查询出来。 sequel 脚本为 select 信号 from 原数据,写好脚本后,执行菜单工具按钮,结果数据展示到脚本下方,这里脚本 select 是 sequel 基本语法规范固定写法,信号表示。将原数据之中八列数据都查询出来, 后面跟着的就是表格名称,这里跟着的是 excel ship 名称,后面跟着美元符,并且用方括号括起来。 如果不想查询所有的列,只需要将新号改成具体的列,名称多个列使用逗号分格。比如这里需要查询姓名和工资信息,脚本改写为 slect 姓名工资 from 表明写好号,再执行脚本执行命令,查询结果只显示了姓名和工资信息。

circle 中的函数总共就三种,分别是聚合函数、标量函数和窗口函数。聚合函数常用的只有五个,分别是加总、求平均、求最大值、求最小值和计数。它有两种用法,第一种是单独使用,它会基于整个表对于某一列进行数值的计算。比如说我们这个例子就是对于这个列求一下平均值。 这种用法跟 java 语句进行配合,它会根据你指定的分组对于这个数值进行计算。第二类函数叫做标量函数,它不会改变数据返回有多少含的数量,而会对于某一列做一些特定的计算。我们 这边用到了两个函数,一个是 up, 一个是 k, k 的 作用是对于这个列取大写字母,然后 k, k 的 话是把里面这一个字母串进行拼接,最后得到第二列这里的结果。 在返回的结果里面,它不会对数据进行聚合。也就是说 customer 里面原来有多少含,返回的还是多少含,不会增加,也不会减少。这里需要提一下,不同数据库用到的标量函数会有很大的差别, my circle, circle over 和 p g 基本上是不通用的,所以我不建议去花很多时间去学函数,因为它们差别真的非常大。 你用的时候去看一下文档,或者问一下 ai, 这样比较好一点。最后一部分叫窗口函数,它处在聚合函数和标量函数之间,既可以包含明细的细节,也可以包含聚合后的结果。比如说这就是一个简单例子,前面三列的数据来自于电影这个表格, 然后第四列做了一个开窗的预算,对于第三列这个数据进行了一个加总,然后我们没有指定加总的范围,它默认情况下是对于整个列进行加总。对于第四列这里返回的结果,它每一个行都是第三列数值的全表加总,你可以通过指定 partition by 的 方式来修改它加总的维度,比如说我们在这里 t 恤 by, 然后根据 rating 来进行加总。这样运行一下,这边 g 的 话,它的加总情况是五百一十四,然后这边的 p g 它加总的情况是五百九十二,所以根据不同的加总的维度,它会得到不一样的结果。 所以窗口函数既可以保留具体的数据明细,也可以保留加总后的结果,它还可以控制数据加总的范围,然后做排名, 在实际分析的工作中是非常有用。我总结一下,搜索中只有三类函数,第一类是聚合函数,总共只有五个,在所有数据库中都是通用的。第二类是标量函数,数量非常多,那比较遗憾的是,不同数据库之间是不通用的。第三类是窗口函数,它可以同时保留数据明细和聚合后的结果,在大部分数据库中都是通用的。

各位同学大家好,在我们查询当中呢,我们还可以使用什么呢?还可以使用这个聚合函数,聚合函数,这是一些指定的函数,比如说求和求最大值,求最小值,求平均值,主要的是这么几个非常常用的函数啊,函数, 那求函数呢,往往是在用来求这个某一个表达式的值值啊,这里提醒一下,其中的空值会被忽略掉,忽略掉啊,另外呢, som 只能统计数字型的列,数字型的列,下面呢有一个例子,朋友们看一下啊, 那这个句号还是放哪地方嘞?放在斯莱克的子句里面,注意放在这个子句里面啊,子句里面,艾滋这个学号,学号啊学号,为什么的学生的总分总分啊, 后面这个其实就是我们讲的,他就是在我们屏幕上显示一下他的这个这个什么就是一个汉字的提示,提示啊,提示总分是多少啊?从我们的成绩库中啊,然后呢给出一个学号为多少的,为多少的啊?多少的。那接下来呢,我来给大家呢演示一下, 演示一下啊,我们先进一个查询,那这一次呢,我们更多的是要对成绩表来做了,成绩表来做了,往这里提醒一下啊,如果觉得你的字太小的话,就显示的字太小的话,大家看我,哎,现在呢,大家可发现这个字大些了, 就字号变大了是吧,这个是哪里设置呢?单机工具选择选项,在选项里面有一个字体和颜色,在这里选择字号大小,默认的是十号字,你可以 可以把它调成十六号次,确定更大一号啊,更大一号, s l e c t 十来个台巡航 f 二 a 四这个 resort, 我们看一下这个成绩,成绩啊,这里有这个,我们比如查这个学号是 g 幺二六三二零幺同学的总分,总分怎么查呢?这是一二一四 c t, 而这个位置呢,我们有一个函数, so 扫码,扫码函数,这里面最好能写上什么呢?写上具体的列字条,等他 t u t n t student, 瑞萨特就是这个列的名称啊,那等人阿姨 surt 瑞萨特啊,瑞萨特,这是列的名称,后面呢? 艾子艾子艾子啊,那个学生总分总分啊,某某学生,这里就不写了,不写了啊,那这个缩进一下啊, wwh v 啊啊 v 啊 v 啊,自动弹 number 等于多少?自动弹 numbers t u dnt 自动弹 dnt, 自动弹 number 等于。这里要加代言号了,代言号了啊,是这个记啊,记幺二六三二零幺啊,二零幺,我们淡季执行看一下啊,这里有一些问题,有些错误啊,死等等等,这一方式写错了吗? 我们看一下啊 s, 我们可以把这个表的名字写拿出来啊, resat, 表中的,表中的啊,斯顿顿的,那么这样就给清楚一下了,清楚一下了啊,执行一下,这里面 谁来给他哦,还有很重要的问题,忘记了,服装哪个表没有写是吧, 雷炸的表不,这个不能少,这个少了以后呢,他不知道从哪里去找,去找啊,学生总分是一百六十四,就是七十六加八十八,大家算一下一百六十四是吧啊,一百六十四,学生总分总分啊,这就是散寒色的用法,用法啊,用法。 哎,这里需要提醒一下,提醒一下啊,就这种查询呢,只能返回一个值,因此啊,不能直接于可能返回多行的利一起查询,比如说下面这 朝鲜将会是错误的,错误的啊,有一个这个,这是他的这个总分啊,这个同学的总分啊,总分,同时呢,他又输出他的这个课程编号, 又把课程编号给数出来,这种情况那是无法实现的,无法实现的啊,我们来给大家演示一下,演示一下啊,总分后面加个逗号啊,比如说我把这个扫把揭开它啊,一 s 人,咋的? 显示一下他的这个,这个,这个什么,显示一下他的 他的这个,这个课程编号啊, subsub, 萨布杰给他 ect 是不解开的 id id 啊,我们来看一下,执行一下 这个位置,他会显示一个什么 a 散布这个的 id 无效,无效,为什么?因为该列包含有聚和函数,有聚和函数,有这个丧,有丧,那你这个位置,因为啊,同学们,我们看看第一条啊, 我们注视点,我们执行一下,执行一下,大家看,据说这个总分呢,是一百六十四,是吧?他说呢,扫把节跟 id 有两个,一个是十三,一个是十四,这就意味着他会返回两行数据,两行数据啊,哎,这个萨姆呢,他只返回一行数据, 这就这个题目的啊,就这地方所说的意思,大家要注意,就错在什么地方了,就是你这个萨博基科 id 呢,他有多个多个指,而这个萨姆呢,他指纹数是一个指的情况,聚合函数的都有这个问题。
![[SQL学习Day138]LEFT函数+分组+聚合 #计算机 #面试 #秋招 #SQL #数据库](https://p3-pc-sign.douyinpic.com/tos-cn-p-0015/okr8hZAwigyFtY5WBIhEa3ciIBNAoZt7PQIJP~tplv-dy-resize-origshort-autoq-75:330.jpeg?lk3s=138a59ce&x-expires=2086470000&x-signature=yZjTUHoyQyzjwy39R2jNr2OUiSY%3D&from=327834062&s=PackSourceEnum_AWEME_DETAIL&se=false&sc=cover&biz_tag=pcweb_cover&l=202602150757250322CE93F23E0F8E75E4)
呃,这道题给了一张表,这张表呢,他是记录了每一个职位,呃,在每一天他所对应的一个简历的数量,什么意思呢?比方说你看到对于 c 加加这个岗位,呃,在二零二五年的一月二号这一天有五十三份简历,在三号这一天有五十四份简历。 好,然后每门语言都是这样的,然后我们预期是什么呢?我们的预期呢?是,呃,按照月份去做一个区分。什么意思呢?就是说, 呃,我希望呢,按照一个月份呢?呃,将每个月份它的每门语言的简历的数量输出成一个表格,那我们要,那,那我们会做什么呢?首先你肯定是要先 select from, 那 我们的表的名字是什么? 表的名字是叫简历的信息,对吧?那个 resume 的 一个 infor。 然后呢,我们要做一个过滤, 就是我们在这里的要求是我们只需关注二零二五年的,所以说我们考虑 date, 通过 year 这个函数将它取出你的年份等于是二零二五。 好,那之后呢,因为你看到我们的每一行都代表着一一年当中的一个月份,所以说呢,我们应该做什么?我们应该去做一个 group by, 对 吧? 那么我们 group by 根据什么去做 group by 呢?我们是不是要根据月份?那月份我们先在这里先写一个 job, 对 吧?然后呢,月份是什么月份?它是,呃,一个 那个什么一个日期信息的前几位,一位,两位,三位,四位是年,一个横杠是五位,再加两位就是月份。所以说你相当于是取取其中的一个七位,那也就是你可以用 left 这个函数把 date 传进去,然后获取其中左边的一个七位数吗? 然后叫名字,叫一个,就是叫月份,对吧?然后第三个呢,你要去算一个总和,那总和你可以使用上这个函数,那我们会根据这个嫩这个字段呢去做一个累计,我们叫它 c n t。 好, 那最后的话我们做排序,我们做分组,应该是根据你的职业和你的这个月份做一个分组。 好,然后呢你还需要去做一个排序,那我们根据什么来排序?我们先根据呃月份来排序,对吧?也就是你的月份做降序排列。之后呢,你要按照简历的数量去做一个升序排列,也是做降序排列,我们来看一下 它是可以运行的。那么在这里我们可以拿到什么可附用的知识呢?呃,我觉得应该是你针对一个 date 类型的一个 column, 你 想拿到它其中的 一个年或者一个月这样连续的一个字段的话,你可以使用 left 这样的函数对它进行一个截取。你看我们在这里就通过 left 这个函数截取了 date 这个 column 的 前七位元素,然后我们把它作为我们的月份。 然后再一个的话呢,就是我们的 groupby 呢,它实际上,呃它是可以用到我们的 select 的, 这个,呃结果对不对?呃,然后这个点我觉得也是比较值得关注的。