00:00
呃,好,各位同学,那接下来呢,我们来看一下咱们文档当中的第12章的内容,第20,第12章内容我们要做的工作是什么呢?是所谓的报表数据导出,首先大家得知道什么是报表啊,所谓报表呢,其实前面也提到过,就是干啥,是不是就是用一些图形化的方式,将我们前面做的各种各样的指标给他更加形象生动的展示出来啊,对吧?啊是这样的,因为你你比如说举个例子啊,你把指标这个结果对吧?一张表你给我,我可能没有太大的感触对吧?或者我可能需要很长的时间我才能分析清楚,对吧?那我这个数据到底是什么含义对吧?大家已经看了这么多表了,对这个应该是深有体会,对吧?你看了表之后不那么直接嘛,对吧?但是我要是用图形给你展示出来,比如说我给你一个饼饼状图,一个柱状图,一个地图,一个桑基图,对吧,那这个东西给到大家之后,是不是立马就能够反应过来它是什么意思啊,对吧?或者能在很短的时间内反过来这个图想表达的内容是什么?所以说这个呃,报表它的主要意义就是这个啊,就是用更加生动形象的方式去展示。
01:00
是数据的信息啊,是这样的啊,那所以我们数仓呢,咱们做了那么多的指标,我将来是不是肯定是需要去做一个这样的报表呀,对吧?啊,那我们的报表呢,前面其实也提到过,就是咱们公司当中呢,我们的做法基本上两种,要么就是我们自己去做开发,要么呢,就是使用一些第三方的报表工具,对吧?但是甭管使用哪种啊,那他们是不是都要去对接咱们那个统计的结果才行,他得拿到咱这个数据,是不是才能去进行相应的展示啊,对吧?好,那完了之后,不管是咱们自己开发,还是使用这个这个现现成的报表工具,对吧?那咱们通常都是把数据给它放到哪儿呢?都是放在一个关系型数据库里边,然后呢,让他们去对接这个关系型数据库啊,我们很少让他直接从have里边取数哈,因为have这个延迟是不是相对要高一些啊,对吧?啊,那所以通常我们会把这个结果从have里边呢,给它导到MY或者是其他的惯性数据库里边啊,是这样,所以咱这这一张要做的工作就是将ADS层当中的,就是咱们还有啊ADS层当中的统计结果导出到哎一个关系数据库里边,当然这个关系数库我们在这用的是MYS是这样的,这就是咱这个报表数据导出这一章要做的主要工作,这一点咱们先给他搞清楚啊,将来呢,接下来咱继续往下进行,那既然我们现在要做的工作已经明确了,那咱们就来分析分析这个怎么去实现啊,咱们现在要做的工作是什么?具体工作是不是就是将have当中的as层的这个结果导到MYSO的数据库里边啊,对吧?这就是咱们现在要做的工作,那这个东西咱怎么实现啊,咱们需要用到什么样的工具呢?
02:34
咱用谁呀?用data叉对不对?OK啊好,那所以咱接下来要做的工作呢,就是使用data叉去把have当中的数据导到MYSQ当中,那data叉怎么用,大家现在还有没有印象,还记得怎么用这,呃,可能稍微有点印象啊,是不是里边首先我需要写一个什么来着,配置文件对不对?一个阶层配置文件对吧?那写完之后,那接下来干啥呀?是不是就可以调用命令去提交相应的任务了,对吧?OK,那这个呢,可能有的同学记得有同学忘了,咱们统一的回回顾一下啊,简单的复习一下,我这文档都已经准备好了,好,那现在呢,咱们简单的回顾一下这子差的基本用法啊好,那这里边的原理等等咱们就都不说了,直接看怎么用,来来看这来到第四章,他这说了,说data圈的使用十分简单,用户只需要根据自己同步的数据源和目的地选择相应的reader跟writeer。
03:25
大家还记得reader writer吧?Reader writer是不是就是我们在配置文件当中所声明的两个字段呀?对吧?OK,那在reader当中我们需要去配置一些跟什么相关的内容?数据源相关的,对吧?比如说你从哪读数据对不对?你读你读哪张表的数据,读什么样的数据,是不是得告诉大家对吧?这是read要配置的内容,那writer里边配的显然就是跟目的地相关的这个信息对不对?比如说你要写到哪儿对不对,好等等等等,是这样的,好,那完之后呢,我们需要将这些内容都配置在一个接算文件当中,配好之后,那咱接下来就可以干啥了,是不是执行下边的这样的一个提交任务的命令了,对吧?那这个命令还记得吧?Python,然后呢,找到date part py,这个是不是就是data data当中咱们用来提交任务的一个pthon脚本呀,对吧?好,那完之后把谁给他就行了,Pass to your Jason,呃,Jason是不是就把你那个JA文件给他,然后他就可以启动这个同步任务呀,对吧,他就会从你writer指向的数据源去读数据,然后呢,把数据写到你的writer所指向的目的地,是不是这样的一个使用逻辑啊,对吧?哎,非常的简单啊,好了,那接下来咱继续往下走,那其实从这个呃一小节咱们就能看出来使用带的圈它的核心体现在哪了,就体现在这个阶层。
04:37
配置文件当中,对吧?所以咱接下来呢,需要简单的回顾一下这个接森配置文件的格式啊好,那现在咱们往下走,这儿是不是就有一个data摊配置文件的格式啊,对吧?来,那咱接下来呢,往下头这儿截了一个图,咱们稍微的把这个回顾一下啊,就是整个data叉的阶层配置文件呢,它外边是不是有一个呃,这个大的字段叫一级字段呀,对吧?我们称之为是不是job呀,对吧?那job下边是不是还有两个二级字段对吧?哪两个呀,分别是content,还有setting对不对?Content里边咱们要配置的主要内容是啥呀?其实说白了就是数学和目的地,再说的准确一点的就是reader和writeer没问题吧?好,那setting里边咱们能配啥东西,是不是调整一些,就是比如说优化相关的参数啊,对吧,比如说速度的这个限制等等等,是不是可以在这个三星里边去配置啊,对吧,是这样的啊好,那当然重点还是落在哪,还是落在reader跟writer里边啊好,那这个reader跟writer当中是不是各自需要两个核心的字段,分别是name和。
05:37
Meer啊,对吧,Name其实就是咱们那个reader或者是writeer的名称,这个能不能随便写,不能,这个必须得是固定的写法,对吧?你要随便写是不是找不到相应的这个reader或者writeer的时间啊,对吧?好,那接下来往下走,那parameter当中要配的就是啥呢?就是跟数据源还有目的地相关的一些,诶这个重要的参数,对吧?比如举个例子啊,假如说我这个reader现在是什么reader,是买s reader,那你在per里边你需要配哪些东西?
06:03
你是不是得告诉他你的买时候的主机名对不对?得告诉他你要同步的那个数据库,得得告诉他你要同步的表,得告诉他你的用户名和密码,他是不是得去连接数据库拿这个数据啊,对吧?就是这个意思,那下边比如说HD writeer,我要配哪些东西呢?你要配name not的主机名,端口号,对吧?你要写到那个目标路径等等,是不是要配这些东西啊,对吧?很简单,好了,那这就是咱们这个配置文件的核心的一个结构,这个一定要回忆一下啊,好,那现在咱继续往下走,那现在咱们已经回忆起来这个就是介词配置文件了,对吧?那咱一会儿我们是不是就得去写一下这样的介词配置文件,对吧?没问题吧?那我们是不是要把have当中的数据给它同步到这个买当中,对吧?好,那现在问题来了,那咱们一会儿写这个配置文件的时候,咱们首先得干啥,是不是得先去选一个reer,选一个writer,对吧?那咱这选谁呢?嗯,对,你你你选谁根据什么来着,是不是根据咱们的这个同步任务的数据源和目的地去选呀,对吧,那咱要把什么从哪把数据从哪导到导到哪,要把数据从have是不是导到my circleq当中啊,对吧,那所以理论上当然要选的,我们应该选谁。
07:12
是不是应该选择什么have reader,再加上have这个my circle writer啊,对吧,没,没问题吧,OK,好,那have writer have reader,咱们之前有没有学过。没有,没有学过,为什么没学呢?那我的这个data圈支持不支持这个所谓的have reader有没有呢?有没有,咱们去找一下是不是就完事了,对吧?来咱们打开data圈,然后呢,我们进到它的这个get har上的这个官网啊好,那接下来咱们去找一下啊,那里边有没有这个所谓的have的这个reader了,来咱们直接搜,然后呢,搜一下have啊,再家来看这是不是有一个支持的数据源,里边有have对吧?那完之后支持不支持读,支不是写都支持对吧?有读有写对不对?那比如说我想看一下咱们现在应该是读吧,对吧?那我看一下怎么去写,你就点读呗,点完之后各位同学你看它跳到哪了,它是跳到have reader嘛,它跳到的仍然是HD FS reader也是啥意思呢?它所谓的支持从have里边去这个读数据,其实说白了就是干啥呢?它就是从你have那个HDS问题吧,它其实呃什么意思呢,就是说你比如说你想用data去同步have的数据,对吧,你告。
08:24
To带叉的是have的一个表名吗?是告诉他你的库名表名了,不是,他是不认可或者说不能识别这些东西的,对吧?你其实告诉他的是啥呢?是你那个表对不对?在HDM上存储数据的那个路径对吧?其实说白了支持haveve,呃,其实并不是真正的支持haveve的原数据那些信息,它只是支持HD的文件啊,是这样的,那所以在这儿呢,我们呃要选,要去同步咱这个数据的话,我们这要选的reader其实就是hdfs reader,那writer呢,就是买circle writer对不对?好,那hdfs reader呢,就这个重要参数,还有买circle writer的重要参数,大家还有印象吗?没有了,其实咱之前应该是做过一个类似的案例吧,对不对?咱往下走,下边这个data文档下边有两案例,一个是把数据从MYS同步到HDFS,一个是反过来HDFS到MYS,对吧?那我们是不是应该现在正好就是用下面这个案例的这个相关的这个内容啊,对吧?好,那所以咱们把这个给它回顾一下啊,好,那这个重点就回顾配置文件。
09:24
怎么写就行了,那这就是那个配置文件的一个完整的模板,这个咱不看它了,我们就重点看一下下边这个,呃,PPT就可以了,PPT里边是不是重点就给咱们列出来的reader的参数和writeer参数啊,对吧,那在这咱们一个一个看一下,首先咱们先来看这个reader,我把它打开,咱一起我回顾一下啊,我看一个PPT。呃,来,那现在呢,咱们一起来把这个呃,H DFS reader的相关参数看一下,那首先我们先看第一个参数是不是就是name,这个没什么可说的吧,固定写法啊,接下来往下走,下边这个参数是不是就是咱们刚刚看到的parameter啊,对吧?里边是不是有各种各样与这个数据源相关的参数来一个一个看啊,先看第一个,第一个是default FS,这里边其实咱们要指定的就是HDFS文件系统的name not的地址,对吧?OK,那大家自己要编写配置文件,这儿是不是必须得跟自己的真实的集群环境保持一致啊,对吧?这个要注意好,继续往下走,下边这儿还有一个什么pass,这个pass其实指的就是啥呢?就是路径嘛,对吧,因为你现在要把HDFS上面的一个路径下面的文件是不是给它往外导啊,对吧,那所以说你导哪个路径是不是得告诉他,对吧,这就是咱们这个pass这个参数的作用,好那继续往下走,那下边是什么呢?是column,这个column我们其实说白了是能选什么的,是能选列的,哎,也就是举个例子啊,我现在的HD。
10:44
S当中有一个用特定的分隔符所分隔的这个文件对不对?我现在导的时候我想选其中的某级列对不对?你能不能选的,用date叉是能够选的,但是你想一下你选的时候我能我能根据那个have的表的那个字段名去选列吗?能不能?
11:05
能吗?是不能的,因为咱们比如说一个普通的文本文件,那我这个文件当中会存储我这个列名的信息吗?不会,它只有具体的数据,对不对?那所以说我们选列的时候呢,你不能根据哎,这个文件所对应的那张表的列名去选,你只能根据啥呢?索引去选,对吧?你只能选零列,一列二列对不对,你只能这么去选啊,那当然通常这个咱们也不选,我们一般都是啥呢?是不是就是所有列啊对吧?你这写个星代表就是所有列,就是整个文件都往外打啊,这个理解一下,好继续往下看,这儿还有一个啥呢?还有一个feel type是不是就是那个文件的类型啊,对吧?那现在这上支持的文件类型呢,有文本文件orc,还有这个S和CSV文件等等等等,完了,这个完成之后咱继续往下走,下问你这个文件的压缩格式啊,对吧,那支持GZ和BC等等等等,OK,好继续往下走,那下边就是文件的这个编码是,诶这个UY,好继续往下看,那这是不是有一个参数叫做no for ma呀,对吧?这个参数就相对来说比较重要了。
12:05
啊,它其实在指定什么呀,Now值的存储格式对不对?啥意思啊?来各位同学,我们现在一起来思考一下,就是其实咱们这个hdss writeer reader啊,就更多的时候,其实咱们就是让他去把哪的数据往外导呢?更多的时候其实就是把have表下边的文件往外导,对不对?是这样的,那你想一想have表里边是不可能会有now值啊,对吧?那你想have表里的now值我再往外边导的时候,比如说导到MYS当中对不对?那我是不是必须得给它转换一下啊,对吧,为啥?因为now值在have里边的这个存储的格式跟在my soq里边的格式是不一样的,对吧?啊,实际上必须得转换一下,那这个转换的时候,你是必须得告诉data你have里边到底谁是no啊,对吧?没问题,你得告诉他谁是no,那data叉是不是才能帮我们去做这个转换呀,对吧?OK,那咋样呢?我们下当就是在告诉data叉,我们这个文件当中反斜杠大N是no对吧?那这样一来,Data在同步数据的时候,只要遇到你这个文件当中的反向大N,那是不是就会转成nu,然后呢?
13:05
存到其他的这个目的地去啊,对吧?是这样一个逻辑,所以在这儿我们需要声明一下,这个反斜杠大N,好,那既然是呃这个反射大N的话,我这为什么要写两个反斜盖呢?这是为了干啥转移对吧?这是在哪进行转移啊,为了在哪转移,是在Linux里边转移吗?不是,这是为了在Java当中进行转移吧,对不对,为啥你要知道,就是你这写的这个配置文件最终是谁读的,是这个叉会去读这个文件,对吧?而那他是不是用Java写的对吧?啊,那所以他读到这个呃值的时候呢,你比如说你直接给它反斜答案,那它是不能识别的,为啥?因为反斜杠在哪,在加语言当中是不是本身就是一个转移字符啊,对吧?所以为了让它保持这个反斜杠原貌,我们需要再对齐进行转移,那写两个反斜盖,这个注意一下就行啊,好了,那这个完成之后我们继续往下看,下面还有一个参数,这个就简单了,Field diimter啥意思?是不是就是文就是字段的分隔符啊,对吧,就是杠T吧,对吧,那我现在问一下大家,你说一会儿咱们去写这个,呃,Data的配置文件的时候啊,那这样咱们应该跟谁保持一致。
14:07
跟哪保持一致?对艮分得跟咱们ADS层的那个表的建表语句里边的分隔符保持一致吧,没问题吧,因为咱们这要导的是不是就是ADS那个表下边的文件对吧?哎,这个一定要注意,其实咱那个表大家要有一项的话,咱们写的应该就是就是杠T对不对?也一会咱这是不是就得这么写呀?哎,这个一定要注意啊,行,那h DFS writer的相参数,咱就说reader的参数就说完了啊,那接下来是不是还得再来看一个writer啊,对吧?什么writer应该是买circle writer对不对?好,咱们打开看一看这里边的核心内容,呃,那首先我们还是先看这个名称,Writer固定写法没啥可说的,对吧?继续往下看。下边是不是也是有一各种各样的这个permeter参数啊,对吧?来一个个来,首先我们先看第一个数据库的用户名,数据库的密码,这个为为啥一定要写它呢?很简单,因为不管是my s writeer还是my s reader,对吧?不管你是让我们买S里边写还是读数据对吧?它底层的原理都是什么呢?其实都是走JDBC的对不对,都是走JDBC的啊,那所以说你要想通过一个JDPC去连接一个数据库,它是不是得登录啊,对吧?是不是得有用户名和密码对吧?所以这个必须得写啊好,接下来继续往下走,那下边我们还要填哪些内容呢?啊,一个就是表名,那这个表名指的是什么的表名啊,是我们要读的表吗?不是我们现在是要把数据往买侧边写嘛,对吧,所以说你要写的那个目标表啊,这个一定要注意好,那他完之后继续往下走,这个就是啥呢?这就是JDBC的URL啊,对吧?在URL里边其实体现出来哪些内容了啊,是不是有一个你的数据库的主机名,动口号,还有你要写到的那个库的库名啊,对吧?好,那你看一下。
15:44
啊,你只要把这些内容声明好了,那这个data叉是不是就已经知道了,我们要把数据写到哪台这个节点上的,买搜QL数据库里边的,哪个库下边的哪个表里边的啊,对吧?然后呢,它也能够连接上这个数据库了,诶是这样的啊,其实就是在配置这些信息,好那接下来继续往下走,下边是不是还有一个column嘛,对吧,就是你要把这些数据写到这张表当中呢,哪些列里边,那当然呢,我们这是不是通常就是全部的列啊,对吧,你就把这个列里边都给它列在这就完事了,好,那这个完成之后,咱继续往下看,这还有一个什么。
16:19
这个参数比较重要,叫做write mode是不是写入的模式啊,对吧?哎,大家还记得这个写入模式有几种。有,实际上是有三种的,哪三种呢?分别是insert模式,还有replace模式,还有update模式,一共有这样的三种模式,这三种模式它们之间的区别大家还记得吗?还记得吗?首先,什么情况下他们仨才会有区别?哎,对,是你在重复的去执行这个数据的写入的时候才会有区别啊,啥意思呢?假如说举个例子啊,比如说我这儿呢,有一张空表,一张空表里边什么数据都没有,对不对?然后呢,我用这三种方式往里边写数据的时候呢,他们的效果是完全一样的,对不对?什么时候他们才会有区别呢?就是当你再往一张表里边重复的写入相同的数据里面,那他们仨的表现那就会有所区别了,那接下来呢,我给大家说一下,他们仨在重复写入数据的时候到底有什么区别,那首先什么叫重复写入,就是我表里边是不是已经,哎,就是有我本次写入的数据了,我之前已经往里边写过一次了,对吧?啊,然后呢,我再重新写,这叫重复写入嘛,对吧?好,那现在我们来看一下啊,你管里边重复写的时候会出现什么问题,那先说ins inside,假如说in inside这张表里边已经有我们所需要的数据了,对吧,那我用insert再往里边写会出现什么问题?
17:44
这个得两种考虑两种情况啊,哪两种情况呢?第一个就是你这个表有没有主见对吧?如果表要是没主见对吧,那我再执行一个重复的因S的,那数据能不能写进去,先说能,他会报错吗?不会,但是呢,你这个数据是不会重复啊,对吧?哎,这是要注意的,好,这是iner into,好那么之后我们再来看一下replace into,首先需要明确的是啊,就是replace这种方式,还有update这种方式,要想正常的工作必须得确保什么呢?得确保你买搜Q表里边得是有主见的才能正常工作啊好,我们现在继续往下进行,那完之后,假如说我现在呢,用replace这种方式往MYSQ里边重复写入数据,那他会怎么做呀?
18:24
Replace,其实它底层对应的in inter,那个插入语句就是replace into啊,那咱们可能平时用买词用的更多的插入语句就是啥呀,In into对吧,那其实还有一个语法叫做replace into啊,Replace into,那它的执执行逻辑是什么?什么叫replace into?Re replace,不就是替换嘛,对不对,那也是,他是怎么去做的呢?他会直接把表里边已存在的那条数据给你怎么样。直接D类的删除掉,删除之后呢,再把谁写进去,你本次新的数据给它写进去,这就叫做什么,这是不是就叫做替换呀,对吧,是这样的啊OK,那是根据什么替换的呢?就是根据主见嘛,对不对,所以他要想正常工作,你这个表里边必须得有主见才行,好这是replace,好,那另外一种方式叫做update update它的执行逻辑是什么样的呢?
19:09
什么样的,也就是如果表里边已经有这条数据了,那他他是怎么做的,他是在原来这张呃这这条数据的基础上进行一个什么操作,Update修改操作啊,他用什么用你这条新的数据的各个字段的值去修改,那表里边已存在的这条数据啊,是这样的,OK,那这就是update,那从那其实大家应该能够看出来啊,在我们重复的往一个表里边写入相同的数据的时候呢,那其实咱们单看最终结果啊,单看最终结果你会发现音色的印度它自己是一种情况,然后呢,Replace和update它俩最终的结果应该什么样的,应该是一样的,没没错吧,只不过他俩实现的这个手段是不一样的,Replace是直接替换,那update呢,是在原有的基础上直接进行干啥呢?进行修改啊是这样的,这一点大家需要去给它搞清楚,这就是咱们这个三种写入方式,那一个呢叫做iner的into,一个呢叫做replace,一个呢叫做update OK啊,你要是看使用结果的话,那其实replace。
20:09
跟update它俩效果是一样的,诶这一点理解一下就行了啊好,那一会儿呢,我们就得根据咱们的实际情况去选择一个写入方式,这个咱们是需要去分析,需要去选择的,那到底选谁这个一会儿咱们再进行分析啊好了同学,那截止到现在呢,我们就已经把data叉的这个配置文件的核心参数做了一个简单的回顾了,行,那这个回顾完之后,我们就先告一段落啊,视频我听一下。呃,好,各位同学,那咱继续往下进行,那下边呢,我们要讲的内容是什么呢?大家往下看,我们要做的就是在买词会里边见库见表,为什么要先去做这个事了,很简单,你想啊,你这个叉要想把ADS的数据导到MYSQL里边,你买SL是不是必须得先有库有表才行,对吧?你连表都没有,我给你导到哪儿了,是不是不知道对吧?所以咱们首先得在百色L里边先去建库建表,那在这儿呢,我们为咱的报表应用创建一个单独的数据库,称之为。
21:04
Jao report report是不是就是报告报表的意思啊,对吧?OK,那在这儿呢,我们为他创一个这样的数据库,那这个呢,就是建库的语句,这个你可以直接在MYQ里边执行,或者说呢,你用这个可视化的一个客户端去执行一下也行啊,在这儿呢,我把它打开那位看一看。打开之后呢,在这儿我们先把数据库连上之后呢,在这儿是不是右键新建数据库就完事了,对吧?在这呢,我们起个名叫做jma putt,是不是就j Mo report呀,对吧?好里边呢,我们需要选择相应的字符集,自己咱就还选UTF8就行了,那这个呢,我们选择UTF8,然后呢,General CI,然后点击确定好,那现在jma report的这个库咱是不是就有了呀,对吧?库有了之后,咱接接下来需要考虑啥,考虑建表的事了,这个建表呢,相对来说要呃这个重要一些,我们有一些注意事项需要去思考啊,好来想一想,你说在买这建表的时候,咱们应该注意哪些问题。怎么去建这个表?怎么建表啊,直接把这个复制粘贴就就建出来了,对吧?啊,但是这个不是这个意思啊,就是说假如现在让咱自己去往买搜索建表对吧,哎,你你应该怎么去建,怎么去建,首先第一个问题就是你得先知道咱们建哪些表对不对,OK,其实建哪些表这个跟ADS基本上保持一致,是不是就完事了对吧?哎,这个因为一张表是不是对应一张表对吧?那所以说你基本上照着ADS线就行了,这个好处,那完之后是不是就是剩下就是每张表,这个表结构应该怎么处理呢?对吧,那表结构其实也是跟哪一样就行。
22:31
跟ADS时候基本上保持一致就可以了,对吧,这个其实比较简单,好,那接下来呢,我们说一下这里边的一个就是具体的这个注意事项了,首先第一个需要注意的就是啥呢?就是我们这个表当中的具体的字段,OK啊,这个字段咱们需要注意哪些问题呢?首先第一个就是字段的个数,字段的个数我们尽量跟哪保持一致的,跟ADS层的表保持一致,尽量保持一致啊,是这样的啊,这是大家需要去注意的啊,这是第一点,那第二点是什么呢?
23:01
就是字段的类型,字段类型,字段类型呢,虽然没有办法保持完全的一致,为啥?因为你have当中它的类型跟买搜当中数据类型是不一样的吧,比如have里边字符串我们叫string,对吧?MYSO里边它叫啥呢?叫做work对不对,它是不一样的,所以说这个呢,你得给它来进行相应的这个对等的一个替换啊,这一点要注意,这是类型,那还有一个需要注意的是什么呢?就是字段的顺序。所以呢,顺序也尽量跟have当中as层保持一致,是这样的,为什么啊,你想一想,你其实说白了,你你你你把have的数据往马思导,你导的其实就是啥,导的就是文件对不对,没问题吧,那所以说你那个文件当的顺序是什么,那你是不是在ADF在买思Q当中建表的这个字段的顺序就应该是什么呀?对吧?啊是这样,所以字段的顺序咱们也要进行这个注意,是这样的,比如在这呢,大家需要去注意的内容就是啥呢?就是字段的个数,字段类型,还有字段的顺序,这个要跟have当中ADS层保持一致,这是需要注意的,然后还有一个点需要注意,那就是啥呢?
24:04
那就是啊,就这个表我们一定要有主见,一定要有主见,为什么一定要主见呢?这个咱们一点一点分析,各位同学,那首先我们先来思考一个问题啊,各位同学,就是将来咱们往买circleq当中导数据,是只导一次就完了吗?并不是,这个是不是每天都要导,为什么每天要导?因为have当中ADS层咱们每天是不是都会往里边写入新的这个统计结果呀,对吧?只要有新的结果,那咱是不是把这个数据导到哪,就得导到与之对应的买的表里,对吧?每天都要导一次,好,那你想一想,每天都要导一次,咱们就得考虑一个什么样的问题了呀,什么问题?就是数据的重复导入问题了啊,为什么?你大家来想一想,首先咱们需要明确的一点是,我们用对的叉往买思当中导数据的时候,对吧,我们能不能去选择,Have当中我们导哪天的数据,能不能选择。
25:01
这个其实选不了,为啥选不了呢?因为你想啊,就是我们as的表,首先咱们没有分区对不对,咱是不是就是一个表下边是不是就只有一个路径,对吧?那我们用date叉往这个ADS导数据的时候,我们实际上告诉的data叉是什么?你告诉data叉的是啊,告叉是什么啊,是你这个表在HDFS上的那个路径吧,没没没问题吧,那所以说实际上说白了,我们代理商每天往诶买测里边导数据的时候,导的都是啥,都是这张表下边的全部的这个数据吧。大家想想是不是这么回事对不对?你能去选,比如说我指导今天的这个数据吗?你能写过滤条件吗?你写不了,你只能是把那个路径告诉他,那路径下边是不是存储的就是这个表下边所有的这个数据啊,对吧?所以说他每天往外导的都是这个表的全部数据啊,既然是全部数据,可能出现一个这样的情况,对吧?比如第一天的时候,我这部分数据已经打到MYSQL里边了,那第二天那这个ADS的表里是不是新写入一部分数据,对不对?那第二天你打的是不是还是全本的数据,所以说昨天的那部分数据是不是又会往我的这个my sol里边导一遍呀,对吧?那这时候就得考虑,诶,这里边我可能会出现这个数据的重复写入问题,对不对?那怎样能避免这个重复写入呢?
26:15
是不是可以根据可以选择什么,是不是可以选择合适的那个写入模式啊,对吧,刚才说了mys write,咱们有三种写入模式吧,Insert or write,还有那个,呃,不是in,不是insert,还有那个,还有那个replace,还有那个updatene,对吧?三种模式那在这我们可以选谁?基于这个情况,我们为了避免重复写入,咱们可以选谁呀?两种你可以选replace,也可以选啥,Update是不是都可以啊,对吧?因为他俩的结果是一样的,对吧?但是我刚才又提到了,你replace跟update要想正常的工作,必须得保证咱们这张表有啥来着,得有主见是不是才可以啊,对吧?啊,是这样的,所以说在这儿呢,我们这个ADS这个买当中所有的表咱们都得有主见才可以,这是大家需要注意的啊。好了,那也是,这是咱们的几个注意事项来总结一下啊,就是咱们在ADS在买X当中建表的时候,你要保证它的字段的个数,还有类型,还有顺序,诶跟啊,还有里边保持一致,对不对?再有一个呢,就是得保证每一张表都得有主见才行啊,这个一定要注意,因为我们。
27:16
往里边写数据的时候,咱们需要使用replace或者是update这种写入模式啊,对吧,这种模式是不是要求表里边有主件呀,对吧?这个理解一下啊,行了,各位同学,那接下来咱们继续往下进行,现在呢,我们来就是练习一下啊,练习下什么事呢?练习一下咱这个补件怎么找,就是有的同学可能哎,这个主见听起来简单,到时真让他找,他找不对,对不对,比如说咱们现在呢,举个例子,我们现在以这个需求为例,这是我们之前做的ADS层第一个需求,对吧,下边是不是就他那张表对吧?好,那这个主件咱们应该怎么选。选一个这个主件应该选谁?统计日期能不能作为主见,能吗?显然是不行的,为啥你每张每天输法这上面里都会写出很多条数据对吧,很多条它的DT是不是都是同一点,就所以它D主件是不是得能够怎么样来着,是不是唯一的表示一样数据啊,对吧?所以DT肯定是不行的啊,那还得有谁加上光有他俩行不行,还不行,还得加什么,还得加上渠道对不对,也就必须得把这些东西全部都声明,才能准确的表示一行数据,对吧?所以这两本的组件是一个联合组件,它由这三个组件联合而成,哎,这一三个字段联合而成,这个一定要注意啊,好,那这个完了之后,咱们再来分析一个来看这个,那他咱们选谁?
28:33
路径分析这个表咱选谁作为主因DT加re z行不行,行吗?光有它是不行的,你还得加上谁,你还得加上source和target的,对吧?是不是只有这四个字段才能唯一的表示一行数据啊,对吧?是这样的,那所以说这两本主点应当是他们四个啊,是这样一定要注意啊,好了,那完了之后呢,这时候我需要给大家去申明说明一个小细节,哪小细节就是关于这个数据装载啊,就是这张本的数据装载之前,咱们在真正做的时候,就是最后有一个小细节,当时没给大家说啊,是因为没有现在这个场景啊,现在可以说了,大家注意观察一下,你看最后一个小细节,我是不是对target做了一个NVR的处理,对吧?啥意思,就是它为空,那我就返回一个什么东西,返回一个no的字符串,对吧?我没有让它返回真正的nu值对吧?大家说这是为什么?
29:26
其实很简单,就是因为考虑到在adi在买so当中,对吧,咱建表的时候需要将target给作为什么主键里边的一部分,联合主键里边的一部分对不对?好,那既然是主键,那它能为空吗?是不能为空的对不对?那怎样怎样去解决这个为空的问题呢?咱们就把它转成了一个是不是字符串了,对吧?哎,这个就不是空了啊,实际上这个一定要注意一下啊,OK,好,那这个就是咱这上面的一个主键,也是主键,咱们得会选才行,好那在这儿呢,咱们就说这么多,我就不带大家一定去看了啊,就是一定要仔细的分析,看看到底谁是能够唯一的表示这一行数据的,一定得会选才行啊好了,那这就是咱们在买思库当中去建表的时候的一个注意事项,那在这咱们该说的就都说完了啊好,那接下来呢,我们就快速的把这些表呢,都给它创建出来,来,咱直接往下走走,那咱这儿呢,一共建了多少张表呢?一共是15张表,因为我们的have当中是不是就有15张表,对吧?好,那现在咱们这个表都给它建一下,那在这呢,我先把这个建表语句给它处理一下,CTRLV。
30:27
呃,因为这里边是不是有标题啊,对吧?来我把这个所有的标题都删掉啊,我可能F一下咱们还是用一个整则匹配,这应该是用一个数字开头对吧?呃,完了之后后边呢,我们呃应该是拿一个这个括号对吧,但这括号没有选全选中,呃,为啥呢?呃这个这么写不行,咱们得怎么想啊,我得想啊得这么写,呃得写一个这个方括号对吧,方块咱们写一个零杠九,这个是不是能匹配上所有的这个这个这个数字啊对吧?然后那个括号还是一个中文的括号吧,应该来诶是一个中行的个这个是一个这个中文的括号啊好,那完之后这个全匹配上了吗?这个有没有全匹配上这个有没有全匹配上这个,呃,应该是都匹配上了,应该是都匹配上了啊,那在这儿呢,我这应该是没问题,为啥从哪能看,从这能看出来。
31:12
这这是不是有一个这个15啊对吧,15个,咱们是不是一共15个标题,这样就都选上了,好,那这个直接这么写一下,然后呢,给它选中,这个给它选中啊翻到然后呢,诶当然这个还不能这么选,你后边还得写个啥,还得写一个点点星才行啊诶但是你点星这么选的话,是不是前面选不着对吧,所以在你这么写不行,呃我这儿我想想怎么来一下啊呃诶这个怎么又变成他了,来我们再来一个方块啊,来一个他我这来一个这个呃一呃然后呢,来一个零杠九,零杠九,然后后边呢,咱是不是得给他再来一个呃点星啊对吧,哎不行,你这么想还不行,我想想这个怎么弄啊呃里边是不是再给它加上一个任意字符对不对,OK,那这样一来是不是就都能够选中了?没问题吧,那我现在这个标题是不是都选中了对吧?这个正则大家可能不太熟是吧,好现在总之都选中了对吧?好,那大家自己要是操作的时候,你要选的话啊,你不能随诶还没全选中,这个没权选中,那这儿我想想啊,这个怎么写啊,我知道我说你得你得这么写,先写一个,他写一个零杠九,完了之后呢,我这儿写一个点不行,因为它格子是不上面有的没有啊对吧,有的只有一位,那我这写个点星啊,没问题吧,然后呢,我再来一个哎方括号,然后呢,再来一个这个点,行,这回大家注意观察,我是不是才算真正的选中了我这15个标题了,对不对,这回没问题了吧,哎,这回都选中了啊好翻到,然后呢给他删删除,当大家自己要调整的话,一定要注意你这个别瞎写,你有时候瞎写的话,你要把这里边的东西匹配上,那是不是就相当于就出问题了,对吧?啊,一定要精确的匹配这个标题啊好,都匹配完了之后,我们现在继续完横,那下边呢,我们要做的工作就是啥?诶下边咱们要做工作就是在买思当中,是把这些表都给它建出来,对吧?来我们这右键。
32:58
点那个吧,点一个新建查询啊,然后呢,使用咱们这个jama report库啊,然后拿过来拿这个ctrl a,然后呢,全部运行好了,如果没有问题的话呢,那这里边是不是应该会出现15张表才写完对吧?好,那表应该就都已经建出来了,好了,那截止到现在呢,我们在买四个当中,建库建表的工作就算是完成了,来完成之后视频我停一下啊。
33:19
嗯,好了同学,那截止到现在呢,我们买so当中的库和表就都建出来了,对不对?那ADS层的数据是不是咱也已经准备好了呀,对吧?那现在我们就只剩下中间的这个导出的工作了,对吧?就是谁是不是就是data叉对吧?啊,那data叉怎么用,大家应该已经回忆起来了啊,所以我们使用data叉首先咱要要做的工作就是啥呢?是不是就得去编写一个datar的配置文件,对吧?那咱现在要导几张表?是不是要导15张表对吧?15张表理论上我们需要去写15个配置文件,对吧?那现在呢,我们先不不去写啊,咱们现在先怎么样呢?先以一个表为例,对不对?咱们看一看它的配置文件到底应当怎么写,然后呢,我去给他测一下就行了,然后至于其他的那些表的配置文件,咱怎么怎么去做呢?咱就不再去一这个写了,咱们直接写一个一键生成脚本是不就完事了对吧?好,那现在咱们现在先挑一两表为例,咱们先测一下,看看能不能通啊好,那现在咱们以谁为例呢?就以它为例,这个应该就是我们做的第一个ADS的需求吧,对吧?各渠道流量统计那个啊,好,那它的配置文件应该是什么样的,其实就是这样的,这个咱们肯定不能一点点写啊,咱们直接把它拿出来,让他一起给他看一下就行,先给他美化一下。
34:29
来,来一个阶算美化工具CTRL为我放在这儿好了,同学,那现在呢,我们就一起来看一看,就是这个配置文件到底是怎么写的,我先把这里边的内容都给它收起来啊,那大家看一下是不是整个配置文件最外层这个一级字段就是一个job呀,对吧?那里边呢,是不是包含两个字段,一个是content,一个是sing,对吧?在这儿呢,我们重点看一下content content里边呢,是不是也是两个核心的参数,一个是reader,一个是writeer,对吧?那咱现在先看reader reader里边呢,是不是分为name和perer对吧?那name咱是不是就得是HD FS readter对吧?这个不多说,然后重点看permeter permeter其实跟刚才我们所说的是不是就应该是一致的,对吧?来简单的过一下啊,HDFS这个name notde的地址对不对?这个一定要跟自己的保持一致,这个不多说,然后继续往下走,那这儿呢,是不是有一个pass,这是我们要导出的那个路径,对吧?然后注意这个pass在那有没有写具体的值没有,我这写了一个什么Dollar export DR,那这是在干什么呀,这是。
35:27
大家还记得吗?这是不是在引用参数啊,对吧?OK,那也就是意味着什么呢?一会儿我们在使用这个配置文件对不对?去导这张表的数据的时候,我们需要在那个任务的启动命令里边给他传一个什么东西,传一个参数吧,对吧?我们得传什么?得传一个具体的导出路径,得传一个参数吧?大家还记得怎么往里边传参吗?还记得吗?应该是什么?杠P杠大D对不对,还有点印象吧,OK啊,那这个一会咱们写的时候回顾一下就行了,也就是这参数咱们没有,诶这个pass这个值没有写死,我们一会儿得传参才行,这一定要注意啊,好,那就来继续往下走,看哪呢?看上面这儿是不是有一个文件的类型,咱们是不是就是文本文件ADS就是文本文件吧,这个不多说啊,没啥可说的,然后继续往上走,那这儿呢,文件的这个分割符,那咱们是不是就是杠T跟ADS的表示一致的,这个不多说啊,继续往下走,那文件的这个标,这个编码是是就是U吧,这个也不说,然后往下走,No form文件的这个no值的存储格式是不是就是反斜盖达的呀,对吧,这个也没啥可说的,然后继续往上看column,咱们是不是就是所有字段对不对,所以说这个其实就是咱们的几个核心参数比较简单啊,这个不多说,然后咱继续往下走,Reader完了之后咱们简单看一看writeer writer呢其实也比较简单啊,首先内幕买和writeer这个已经说过了,不多说,然后接往下走,那下边这。
36:47
是不是就声明了我们这个数据库的主机名对不对,然后呢,我们这个库名对不对,没问题吧,然后呢,还有啥呢?还有我们要导出到的这个具体的表在哪儿呢?应该是在这儿呢,对吧?我们是不是要导到这张表里呀,对吧?那这个表的字段是不是咱们也在这儿给它列出来了呀,对吧?好,那再继续往下看,那下边呢,是不是还有我们这个数据库的主机名和呃,这个用户名和密码,对吧?那这块大家是不是也得跟自己那保持一致才行,对不对,一定要注意啊,好,那这其实就是一些必要的核心参数,就这个比较简单,然后重点看下边那个。
37:19
这个关键write mode是不是就是写入模式啊,对吧?我们是不是得考虑到这个数据的重复写入问题,所以在这我们用的是replace,这一定要注意啊,行了,那这个writeer的参数咱们基本上也就看完了啊,Reader加writeer都完了之后,那接下来咱们继续往下走,下边咱干啥呢?是不是就可以把这个文件给它创建出来了呀,对吧?创建出来之后,那咱们现在就呃可以去给它进行相应的这个测试工作了,来那现在我CTRLC把它拿过来,拿来之后呢,我们就先把这个文件给它创建一下,创建出来之后咱们再呃进行相应的测试啊,那比如说在这呢,我随便找一个地方,咱们就在加速路这边吧,来,我创建一个比如说叫做t.j g son g son好,那完之后呢,把刚才的这个配置文件它给它放里边来,好放进来之后它接下来就可以带上了,是不是就可以调用那个被片的脚本,然后呢,去测试这个数据的导出工作了呀,对吧?那咱们现在一起来把这个命令写一下啊,首先咱需要先干啥,是不是得先找到那个date片的那个。
38:20
数据那个命令了,对吧?好在哪放是不是在date的安装目的下边有一个BB里边有一个date圈的PY啊对吧?OK,好,那这个脚本咱们怎么去执行它啊,那咱们之前文档当中写的是不是应该是这么去调用它,不应该是Python,然后后边加上这个脚本对吧?那其实我能不能直接这样去执行呢?能不能其实也可以,这个Python脚本跟shell脚本是类似的啊,你shell脚本你是不是可以对那个SH文件加执行权限,然后直接调用它,对不对,你是不是也可以拜事加上这个文件啊,对吧?那咱这个data Python脚本跟那是一样的道理啊,那咱这个data圈它的这个这个data圈的PY有没有这个执行权限的,有没有咱可以去看一下对吧?进到OB Mo就进到这,进到B去看有没有执行权限,有的呀,对吧,有你其实就可以直接调用了,那在这呢,比如说直接这的P,然后后边咱们需要做一个什么工作,是不是得找到咱们自己刚刚所写的那个T接森文件啊,对吧?哎,那理论上你这样直接一回车,它是不是应该就能够去执行这个同步任务了,对吧?但是咱现在能成功啊,显示成功不了,为什么成功不了呢?因为咱这个参数是不是没传啊,对吧,没问题吧,OK,好,那完了之后咱是不是得给他传一个擦呀,对吧,传三怎么传来着,哎,回忆一下应该这么写,应该是杠P,然后后边呢,是不是来一个引号里边里边再写啥杠大地对不对。
39:39
再往后呢,是不是就是K等于Y6就完事了,对吧?应该是ex p t export dl,咱个参数名是叫这个吧,找一下是不是就是export DR没有问题吧?好,它是不是得等于你具体的那个导出的路径啊,对吧?那咱那个导出的路径在哪啊?你要导的是哪张表,你要导的表是不是是哪张表来着?
40:02
刚才咱们是不是测了一张表对吧?咱们测的是哪张表,往上走应该是这张表了,咱是不是要把这张表给它导出去啊,对吧?那所以说我是不是得在HDFS上面找一下这个表路径,对吧?那咱现在去找一下啊,我先打开HDFS它的一个外部页面9870,然后找一下这张表的路径啊,找往下走应该是在VR house里边吧,这帽然后找到谁ADS,然后再找谁,是不是应该是这个路径对不对?那这就是我们要导出的这个路径对吧?来R咱来拿过来,拿来之后呢,我给它放在哪是不放在这个位置就完事了对吧?好,那下来我直接回车。好大来看这次这个数据它能不能导出去啊,稍微的等一会儿,呃,至少目前他应该是没有报错的,而且注意观察,那这儿这个路径是不是也已经顺利的解析出来了,对吧?好,那稍微的等一会儿,好已经完成了,完成之后咱们现在去买测里边查一下啊,来找到咱们这个目标的表应该就是它吧,来ADS by channel对吧?来双击,好大家来看这个数据是不是已经顺利的进来了,只要能进来就证明我们这个数据的同步是没有问题的,数据的导出是没有问题的,好了,那截止到现在,那我们第一个表的这个测试工作就算是结束了,OK啊好,那当然它结束之后,咱们接下来需要干啥?
41:16
你是不是需要去写这样的配置文件,需要写15个呀,对吧?那当然在这儿了,我们就不能一个一句写了,咱们怎么做呢?我们是直接使用带点配置文件的一键生成脚本,OK,好,这个视频我先停一下啊。呃,OK,那刚才提到了啊,就是我们刚才这样的配置文件呢,咱们要写的话得写15个,当然这个肯定不能1.2去写,在这儿呢,我们直接给它一键生成一下啊好,那现在呢,来看一下咱们这个一键生成的脚本,呃,首先呢,我们在这儿是不是需要先去创建一个Python脚本啊,对吧?那现在咱们把这个脚本的内容先给它拿出来,咱们简单的看一看里边哎是怎么样的一个逻辑啊,TRC我拿过来,拿来之后呢,咱们把它放在这个位置,来咱一起看一下,我先调整一下语言,调整成这个Python啊。PYN,好,那现在我们来看一看这个脚本的大体的内容,那首先咱们先看一下这里边的最前面的这几个内容,这其实是非常非常重要的,非常非常关键的,就是每个同学在使用这个脚本之前,都要把这部分内容看一看,因为里边是不是有些东西咱们需要去进行修改啊,对吧?好,那看一看这边哪些东西咱们可能需要用,用到需要去修改啊。好,先看前面这几个,这都是跟谁相关的,跟买搜Q相关的对吧?那大家呢,需要将买搜Q的什么呀?这个主机名,端口号、用户名、密码改成跟自己那个环境一致的对吧?这个一定要注意,好,继续往下看,那这还有两个参数,这是跟谁相关的,跟name note相关的,对吧?大家一定要把它改成跟自己的name note一致的一个情况,对不对,这跟哪保持一致就行啊,很简单,你打开HDFS外B页面,你点一下OU跟这儿保持一致就行,对吧,主机名,端口号一定要一致啊好,我这是没问题的,好继续往下看,在这儿呢,还有一个参数,这个就不是那么重要了啊,这个指的什么?
42:59
是配置文件生成的这个目标路径,对吧?因为一会儿你执行这个脚本,它是不是会给咱们生成一个文件啊对吧?文件写哪儿去呢?它默认就是写在这个路径下,这个路径呢,不需要提前存在,因为我这个脚本当中我加了这个判断逻辑了,不存在它会自动创建的,那所以说你不用管它啊,OK,当然你要想改也能改啊,行了,那截止到现在呢,我们这几个参数就说完了,说完之后咱们简单的看一看下面的具体逻辑啊呃,这个逻辑其实并不复杂啊,首先我们看第一个,呃,这个函数,这是定义的函数对吧?大家可能虽然对对对这个pon语法不是那么的熟,但是你要大概看一看,也也基本能看懂啊啊,因为咱们有一定的语言基础对吧?好,那先看一下这个东西,这个其实在获取连接对吧?Get获取谁的链接呢?获取my sol链接,为什么这要获取my circleq的链接啊,这个很简单,大家看一下。
43:48
就是我们这个杰森的配置文件当中,对吧,我们找到my writer writer里边,咱这需要拿到什么,是不是需要拿到我这个目标表的字段信息啊,对吧?那这个字段信息我总不能说我一个一个往里填,对吧?诶我应该怎么办呢?我是不是应该让他自己去获取啊,对吧?我只要给他一个什么,给他一个库名,给他一个表名,让他自己去从MYSQ数据库里边是不是拿这个字段的信息啊,对吧?那这样更自动一点,那咱就不用一个填了,是这样的,那所以说你要想去MYSQ里边拿这个信息,是不是就得获取MYS连接啊,对吧?啊继续往下走,那下边咱们来看一下这个地方,那这儿是不是又定了一个函数叫做获取MYS克的什么信息,Ma是不是就原数据信息啊,对吧?这个函数呢,一共接收俩参数,分别是库名和表名,你只要给他一个库名,给他一个表名,它就会干啥,他就会去获取这个库下面的这个表的元数信息,这个元数信息呢,我一共获取了俩俩信息啊,分别是什么呢?列的名称和列的类型这个。
44:48
从哪获取的?很简单,它其实就是从我们my circlel当中自带的一个原数据库里边去获取的,OKMY搜当中有一个库叫做information sc啊,是这样的啊,就是这个里边存储的是什么呢?你会发现你自己那块是不是也有这个库啊,对吧?你进来之后,你发现这是不是有一个什么information sc啊,对吧?这个里边其实存储的就是买circle数据库的源数据信息,它里边有我们这个库里边所有的表,所有的字段的这个项目信息,那所以在这儿我们要想获取我们指定的这个库下边指定这个表的原数信息,是不是咱们可以从这个库里边的表里边去获取啊,对吧?诶其实就从那儿拿的,拿了一个字段的名称,一个字段的类型,好,那接下来继续往下走,那下边大家注意观察这个位置。
45:32
这我是不是又定义了一个函数叫做get my circle column啊对吧?这是在获取什么?就是在获取我这个指定的库,指定的表的一个什么东西,哎,字段嘛,就是获取字段啊,这个字段当时怎么获取的,它其实调用的是上面这个函数对不对,然后对这个函数的返回结果进行了一个栏目的表达式的一个处理,那这个可能大家也不太熟悉,这其实就相当于一个map操作,对吧?那是这样的,为啥?因为我前面这儿返回的是什么?是两个字段对吧?是每个字段字段名和字段类型,但我这只要啥,我只要字段嘛,对不对,相当于我这拿到了我们这个相当是一个top里边的第零个元素嘛,是这样的啊,这个稍微再了解一下就行啊,语法大家可能不太熟啊,不用管啊,行了,那这个完事之后我们继续往下看,下边呢,这儿其实就是那个核心的参数叫做generate杰森,这是不是就是生成杰森配置文件啊,对吧?好,那这个函数它的呃核心逻辑是什么样的?很简单,大家来看这儿,首先那我们是不需要给他一个目标的数据库,给他一个目标的表啊对不对,OK,好,那完之后咱继续往看。
46:32
那下边进来之后,他这是就定义了一个Python当中的对象,对吧,那完之后Python当中的对象是可以直接转化成一个接森对象的,是这样的啊好,那在那我们定义这个P对象,这个P对象当中呢,是不是有一个一级的这个属性叫做job呀,对吧?然后下边有什么SS有有content,这个是不是正好对应我们那个接配置文件,对这个咱不多说啊,然后重点看一下reader跟writer reader writer当中你会发现里边是不是有一些参数的值不是写死的,而是咱们拼起来的呀,对吧,比如说谁。
47:03
Defat FS这儿是不是有一个它一个它对不对,这个东西它引用的是谁呀?是不是引用的就是我们在文件的最开头声明的这个参数啊,对吧?那所以这儿是非常关键的啊好,那接下来继续往下看,那当然呢,这里边这有一个参数叫做pass pass,咱这是不是也没有斜词,我们是不是就写了一个Dollar export d对吧?所以一会儿咱们用用它去生成的那个介算文件的时候,那你得干啥呀?是不是也是得传插呀,对吧?这个要注意啊好继续往下看,那这个writer也是一样的,里边是不是也是没有写子对吧?你比如说这个列列是不是调用上面的函数获取对吧?那下面的这个接dpc URL是不是也是咱们拼起来的呀,对吧?这个大家要注意一下对吧,那这个就是咱们这个job这个对象的核心内容,好,那job有了之后,那最终是不是得把它写到文件里边啊,对吧?所以接下来继续往下看,那这儿是不是就是咱们往文件里边写的那段小代码啊,对吧?你看它的核心逻辑是什么啊,首先先看这。判断我们这个操作系统当中对不对,OK,那我这个路径是否存在哪个路径out of the past是不是就是我们前面声明的那个路径了,对吧?好,那完之后呢,如果not就是不存在,不存在我就干啥,是不是就make d就创建这个路径啊对吧,很简单,那现在往下走,创建完之后再干啥,是不是咱往里边去写入这个内容啊,对吧?那首先你需要先打开这个文件,打开之后呢,我们再接森点down,那完之后它就能干啥,是不是就能把我们刚才定义的这个job写到这个文件里边啊,对吧,就是这么个逻辑,然后咱来看一下这个文件名。
48:34
是什么?这里边open里边写的内容就是咱们那个文件名啊,是这样的啊OK,那来看一下这个文件名是什么。首先那这个,当然这里边说的文件名不太准确啊,这其实应该是一个,呃,路径叫什么叫绝对路径对不对?那前面是咱们那个output bus说的那个路径,后边这部分内容是不是应该是那个文件名啊,对吧?好,那来看一下这个文件名,这写的是啥,能不能看懂啊,其实很简单啊,大家看啊,首先在这呢,我是不是调了一个点join的一个方法,对吧?什么叫做点join呢?点join就是以点作为分割符,然后呢,将join这个参数当中的一个什么,你注意观察,我们给以照样这个方法,它的参数是一个什么?是一个数组吧,对不对,它其实就是用点将这个数组的元素拼接起来,这个数组的元素有啥呢?库名这个是啥?表名这个是啥?点杰森,所以最终你会发现咱们这生成出来的那个配置文件的名称就是啥呢?就是库名点表明点杰森,哎,就是这样的一个文件页啊好,那这就是咱们这个核心的逻辑,行了,那这个拍摄文件呢,咱们大概看一看就可以了啊行,这个完成之后CTRLRL大家也拿出来,拿来之后呢,咱给它创建出。
49:43
出来啊好,那在哪呢?我们在102的加木的BI幕下边给他创建一下,呃,大家坚持一下,这个这节课稍微的时间有点长啊,坚持一下,好,那现在咱们把这个文件创建出来,我们先进到并blue,那这个文件呢,咱们给它起个名字,叫什么名呢?咱管它叫做generate exportt,叫做part con,点然然后那个PY啊,然后下写啊S,然后点PYOK,那这是不是有一个in part呀,对吧?这是不是又写了一个1PART,一个导入,一个导出,对不对?那那个导入导出是针对于谁而言的呀?我们是以谁为中心的,其实是以hi度为中心的,对吧?我们往hi度里边写,我们叫做导入,对吧?我们从hi度往外写,是不是叫做导出啊,对吧?这个注意一下,好,那现在咱们直接给它建出来好,那这个文件呢,给它创建来之后呢,我们shift z好了,那这个文件咱就有了,有了之后咱接下来是不是就可以去做一个测试了,对吧,我们看一下这个东西到底能不能正常的工作,那这个东西怎么用啊这个东西。
50:39
来,咱往下走,下面是不是有咱们的这个使用方,呃,这个使用说明啊,对吧?来看一下怎么用,那首先我们需要先去装一个my circleq访问,呃,先去装一个这个Python访问百词的驱动吧,对吧?这个驱动咱们之间有没有装过,装过咱们在做那个数据的,呃,导入的时候是不是已经装过来,对吧?这个咱就不用再重复之间了,尽量往下看看这个东西到底怎么用,很简单,我们只需要调用这个Python脚本,然后后面呢,是不是来一个杠B传一个啥。
51:07
库名再再传一个啥杠T,是不是再给他传一个表名,然后它就能够给我们生成相应的阶层配置文件啊对吧?好,那接下来咱们就快速的测试一下啊来,那现在呢,我直接调用Python pyn,然后再接上咱们这个generate export,肯菲点PY之后呢,是不是应该是杠D加上那个库名j ma re PT对不对,然后后面再来一个杠T加table对吧?那table咱们写谁这个咱随便写一个就行啊,比如说在这呢,我们随便来一个,呃,我随便找一个这个表名,那咱们找谁呢?比如说我们就找这张表吧,咱们随便找一个啊就就以它为例,可德C拿过来拿完之后呢,我放在这个位置好,那现在呢,我直接给他回撤好,那没有报错是不是应该就是好消息啊对吧?好,那现在呢,我们进到OPT啊,进到哪model还进到哪对叉吧,对吧?那咱们那个默认的导出路径是不是就是这个路径啊对吧?理论是不是应在这会生成相应的配置文件对吧?来咱们去找一下啊,进到这个Java,然后RR下大众观察,这是不是已经出现了一个ex了,对不对,那进进来之后呢,我们找到eport,然L大家注意观察,你看这个接的配置文件是不是就已经有了,对不对,那就说明咱这个配置文件应该这个这个一键成了脚本应该是没啥问题的,咱们给他打开看一眼啊,好,当然这个是一个压缩的格式,应该是没问题的,我们就不再做测试了啊好了,那各位同学,那现在经过测试,咱们这个Python脚本使用是没有任何问题的啊好,那接下来咱就要干啥,接下来我们是不是正常应该去执行15个这样的命令啊,对不对,咱是不是得给这15张元每个都生成一个。
52:38
配置文件对吧?那为了方便在那不去一个一个执行,咱怎么做呢?再来一个脚本对吧?那这个脚本其实就是一个简单的shell脚本啊,它里边的内容其实就是啥,是不是就是咱们那15个Python命令啊对吧?那这个咱们就不再多说了,我直接CTRLC拿过来,呃,然后呢,咱们简单的看一看就行,CTRL位简单,各位同学简单看一下这个应该没啥问题吧,是不是Python找到那个脚本生产我们这个库下边的15张表的配这个配置文件啊对吧?行,那接下来咱们把这个脚本快速的给它创建一下啊,这个脚本起个啥名CD到并目录啊,我们就叫做generate的export,这点说SH就完事了,对吧?来直接诶回车按下I,然后呢,把内容ctrl a ctrl c拿过来,来放在这个位置好了之后我们shift z好了,那现在我们要想生成这15个配置文件,我们直接怎么做就行,Change mode加X,然后再加上谁加上刚才咱们那个generate export con,然后点什么东西,点SH对吧,然后呢,直接调用它是不是就完事了对吧?来直接回车好,要是没有问题的话呢,那我们。
53:38
刚才的那个OB mole data job export下边是不是应该会出现15个阶层配置文件呀,对吧,已经出现了,应该是没啥问题了,好了,那截止到现在,那咱们的接森配置文件就算是准备完毕了,好,完成之后视频我停一下啊。呃,好了,各位同学,那咱接下来呢,就继续往下进行啊,呃,那下面呢,我们要做的一个工作是什么呢?那其实咱们应该思考一下,就是想啊,就是咱现在已经为这15张表都生成好了这个所谓的配置文件了,那理论上我们其实可以干啥呢?
54:11
是不是就可以用这个配置文件去导咱们这15张表的数据了呀,对吧?但是咱们要导表的时候,咱们得考虑一个问题,什么问题呢?啊,首先那怎么去导这个表,导本很简单,是不是就执行一个命令就行了,对吧?那咱来看这儿还有一个什么测试生的配准件,这个咱就不测了,应该是没问题的啊OK,那玩意,你要想导某张本的数据,是不是咱就得去执行一个这样的命令,没问题吧?OK Python,然后呢,找到咱们刚刚生成的那个,呃,是不是那个那个那个阶层文件啊,对吧,然后还得给你给里边是不是传了参数,对吧,就是我们需要去执行15个这样的命令才行,但是你要知道啊,这15个命令呢,也不是只执行一遍就完了,对不对,咱需要每每天是不是都得去执行啊,对吧,是这样的,所以说你要是手动的去一个一个每天去重复执行这个文件太麻烦了,对吧,所以咱应该怎么做,怎么做呢?是不是也是写,呃,给他写一个脚本,然后去定时的去调度大家,对吧,是这样的,所以咱接下来呢,需要去给他编写一个每日导出脚本,OK,好,那咱现在要做的工作呢,就是看一下这个。
55:11
脚本到底长什么样啊来,我现在呢,把这个东西拿出来,咱们一起来看一看这个脚本的具体内容,其实这个脚本说实话不难啊,来,CTRLC咱给它拿出来,拿来之后呢,我们继续往下进行,CTRLV我就放在这儿拿了,咱们一起来把这个脚本的大体的内容给它过一下啊来诶这个还不好调,调整一下好了,那脚本呢,就已经放在这儿了,那咱接下来就来重点的看一看咱这个脚本的核心内容,呃,首先各位同学呃,我们先来看一下这个脚本当中的第一个这个环境变量,它这是不是声明了一个date后等于OT Mo date啊对吧,这就指向我们date的安装目录了,这个简单,接下来继续往下看,下边紧接着在这声明了一个什么东西,这是。声明了一个函数,对吧?没问题吧?OK,这个函数的名称叫做handle export pass啥意思?
56:00
是不是就是处理导出的路径啊,对吧?诶这个导出路径有什么可处理的呢?首先咱们得先知道这个所谓的导出路径指的是什么路径,指的是不是就是咱们呃这个HDFS上边的每一张ADS层的这个表的路径啊,对吧?这是不是就将来咱们得一个一个的导出路径啊,对吧?它要处理的是它,诶那这个东西有啥可处理的呢?来我们看一下文档当时怎么说的啊,他这么说的,他说对叉呢,它的导出路径当中不允许存在空文件,那这个文件这个函数的作用呢,就是去清理这些空文件,这啥意思啊,举个例子,各位同学,假如说那这个是不是将来我们的一个导图路径啊,对吧?那这里边现在有几个文,是不是只有一个文件对不对?假如说里边有俩文件,然后呢,有一个文件,它大小是多少呢?是零,这时就一个空文件啊对吧?那我们用data方去导这个路径的数据在这了,它就会干啥的,Data圈直接报错啊,是这样的啊,他说你这个路径下边有空文件对不对,那也就是说data圈是不允许导出路径下边存在空文件的啊,那所以说咱们为了保证这个任务能够顺利的进行,咱是不是得把这个事儿给它处理一下,对吧?好,那接下来咱继续往进行,我们来思考一下啊,就是说我们什么情况下这里边会出现空文件,这里边会有空文件吗?如果它根本就不会产生空文件,那咱们处理它是不是就没啥意义了,对吧?哎,什么情况下会产生空文件。
57:22
什么情况会产生?关键来想想,哎,其实这个很简单,告诉我来咱们思考一个问题啊,首先我们先来明确一个问题,就是说ADS层某张表下边对不对,它有几个文件,这个取决于什么?取决于什么?是取决于我们的数据量吗?这个不完全对,对不对,有几个文件理论上其实应该取决于,假如说我们这个,呃,这个计算也行,假如是map啊,你要是map取决于什么,取决于你有几个reduce对吧?我俩reduce我是不是就有两个文件,对不对,3REDUCE有三文件对不对,是这样的,好,那完之后,假如说我们现在两个reduce,两个reduce完之后呢,我这是不是就会生成两文件呀,对吧?那结果呢,我这个最终的结果其实就只有一行数据,就一行数据,那你说这一行数据它会平均的分到这两个文件里边,是不会的,它肯定是只写到一个文件,对吧?那这样一来是不是就可能会出现另一个文件大小为零的情况啊,对不对,这就是咱们产生空文件的一个场景,也就是说我们这个路径下边是可能会出现空文件的,既然可能会出现,那咱是不是就有必要去处理一下这个空文件对吧?好,那所以咱这儿呢,就有一个这样的函数,那咱接下来呢,就来看一看,就是我们的这个函数,它到底是怎样的一个计算逻辑啊来咱们一块儿一块儿来看一下,首先我们先来看这个这个函数的核心内容,它的核。
58:43
内容的实际上是一个什么东西,For循环嘛,对不对,是不是就是for循环对吧?好,那FOR2循环它便利的是什么东西呢?它便利的是这样的一个结果,对不对,大家注意观察啊,它便利的事物,这是一个命令对吧,命令外边有什么东西。
59:00
由反引号吧,对吧?反引号的作用是什么来着?是不是将这个命令的运算结果返回啊对吧,也就是我实际上我们这儿遍利的是这个命令的输出结果,好,那这个命令输出的是什么呢?我们来看一下这个命令是个什么东西啊,这命令其实很简单,是不是就是hi do FS-LS杠大尔,这是不是就是递归的去列出来某一个路径的内容啊对吧?好,那完之后大家注意观察这个路径,咱们这写的是啥?是DOLLAR1,注意这个DOLLAR1指的是什么?是第一个参数对吧?是谁的第一个参数,不是脚本的第一个参数,而是这个函数的第一个参数吧,对吧?当然一是不是有作用域啊对吧?它现在位于函数里边,那它指的就是第一个,就是这个函数的第一个参数,那你想一想,你将来调用这个函数的时候,你得给它传什么东西?你得给他穿啥才行。你给他传什么呀?很简单,你将来你你调用这个函数就传传参数对不对,传什么参数,是不是就得传咱们这个导出路径啊,对吧?它这个函数的作用不就是用来处理导出路径的嘛,对不对,也是将来咱需要干啥,是不是需要把这样的一个路径给它传进来啊,对吧?就是这么个逻辑嘛,这一点咱们给它搞清楚啊好,那接下来咱继续往下进行,好,那完之后你把这个路径给他之后,那他是不是就递归的展示了一下这个路径下边所有的文件呀,对吧?好,那接下来往下看,后边这儿又做了一个什么。
60:17
Aw k dollar8,这又是在干啥呢?其实很简单,那不知道是啥,咱们是不是直接给它执行一下就知道了呀,对吧?好,那现在呢,咱们就把它拿出来,然后呢,咱们去做一个测试啊,来CTRLC我给它粘出来,粘完之后呢,我给它放在这个位置啊,就是当然这里边咱们是不是需要给它进行一个相应的调整啊,对吧,咱把DOLLAR1给它改成一个具体的咱们的导出的路径,对吧?比如说把它拿过来,我放在这个位置,好这个应该没啥问题吧,好,那我直接回车大致观察,你看打印的是什么。是不是就是咱这个路径下边的这个文件的绝对路径啊。没问题,这是那个绝对路径嘛,对吧?OK,好的,这个是怎么工作的呢?其实很简单,Aw k普顿到八,这是在打印什么,是不在打印这个结果的第八列啊,对吧?那它的第八列是什么呢?你看一下就知道了,这是我们正常执行这个命令的结果吧,对不对,第八列就是啥?你看这是第一列,这是第二列对吧,第三列,第四列,第五列,然后呢,第六列,这是第七列对不对,那每一列中间是不是用空格分格的呀,对吧?好,那这不就是正好是第八列嘛,对不对,那也是我们其实就是为了拿到它的这个绝对的路径,好了,好,那也就是实际上我们这儿便历这个缝循关,你便历便历的就是啥,是不是就是你传进来的这个导出路径下边的一个一个的文件呀,对吧,就是在便利里边的每个文件,好,那咱接下来继续往下进行,那我们现在要做的工作是什么?是不是清理空文件呀,对吧?那清理的逻辑应该是什么呢?是不是你首先得判断这个文件是否是空的,是空的你就给他清理掉,不是空的就得留下来呀,对吧?好,那这个怎么判断的呢?来看一下是不是执行了一个hi do FS杠,Test。
61:55
的杠Z啊对吧,这个命令大家知道不知道是啥意思,如果不知道的话呢,咱是不是可以去看一下对吧,比如说在这儿呢,我执行一个命令,执行一个命令啊叫做什么叫做hi do,然后呢,呃,这个FS,然后呢杠har对吧,后边是不是跟上一个T就完事了,对吧,直接回车,那这样一来就能展示出来杠T的这个命令的这个用法,OK,那咱们用的是谁,是杠Z对不对,你看这个怎么怎么用。
62:20
他说如果这个文件或者路径是zero base inside,它就怎么样,它就RETURN0,对,也就是如果这个文件是一个空文件,它就会RETURN0,否则就会RETURN1,没问题吧,好,那接下来呢,咱们就来测一下这个文件啊好,那在这儿呢,咱们需要怎么做,是不是先执行一个hi度吧FS,然后后边咱们接上什么来着,是不是接上这个杠T的后边来一个杠Z啊对不对,好,那之后呢,之后咱是不是得给他拿一个就是咱们那个绝对路径啊,对吧,是把它拿过来对吧?咱们给他测一下复制,然后呢,我放在这个位置,好,那现在咱们直接回车。OK,那这块它是不是正常会输出一个零或者是一啊,对吧?那咱怎么去获取它呢?是不是一个一个Dollar问号,那就完事了,对吧?直接回撤,注意观察,你看我这返回的是什么,是一,一代表是什么来着,不为空则返回一对吧?哎,那这样一来咱是不是就能看到它不是一个空文件对吧?好了,那接下来我们再回到这个脚本当中来,大家看,那现在这个逻辑大家应该就清晰了啊,我首先先去判断一下对吧,你这儿路径下边的一个文件是否为空对不对?那接下来呢,看下边这个if,那if if什么if Dollar问号E扣零就是等于零对吧?等于零啥意思?
63:32
等于零就是为空的意思吧,对不对,为空我就是不是给他删了就清理掉呗,对不对,那不为空呢,不为空是不是就不管呢,对不对,那这样一来的话呢,我们就能够将,诶,咱这个导出路径下边的空文件给它清理掉了,哎,就是这么个逻辑,这就是咱们这个所谓的handle export pass这个函数的核心逻辑啊好,它完成之后咱继续往下进行,往下走,那下边这是不是又声明了一个函数对吧?那这个函数那咱们看一看它的逻辑是什么,它比较简单来,首先我们先看export date,这是它的一个函数名,对吧?那接下来看里边的核心逻辑啊,首先那这个函数将来它会接收两个参数,会接收两个参数,哪两个参数呢?第一个参数,哎,那其实就是我们那个data圈的配置文件的绝对路径啊,是这样的啊,也就是说,嗯,举个例子,比如说我现在呢,想用这个export date函数去导某一张表的数据,那你要想让导某一张表的数据,是不是得告诉他咱们那个表配置文件所在的?
64:32
途径嘛,对吧?哎,这就是它的第一个参数,好,那接来往下走,那第二个参数是什么呢?Port dl,就是你要导出的那个那个那个和那个那个具体的路径,对吧,为啥?因为在那个data圈配置文件当中,我们声明了那个导出路径了吗?没有,咱们里边是不是写了一个Dollar export d啊对吧,那个路一个参数没有写死的啊,是这样的啊,那所以在这呢,我们需要给它传一下,OK,那接下来继续往下走,咱们再往下看看哪了,咱们看这个位置。
65:02
这这是在干啥?这很简单,这其实就是在handle export pass,是不是就是在调用前面那个处理导出路径的函数对不对?那把谁给他,就把我们的导出路径给他,那他是不是就会清理这个路径下边的空文件对吧?那也是到现在为止路径已经准备好了,那下边咱就可以干啥了,是不是就可以执行咱这个函数的核心逻辑就是往外导数据了,对吧?好导出去,你看它怎么导的,是不是直接调用了一下data叉的加目录下边的B,目录下边的data叉点PY这个脚本对不对?然后呢,下边是不是杠P,然后杠大dport DR是不是把我们传给这个函数的导出路径是不是给它放在这个位置了对不对,然后再往后呢,是不是还得把这个表的一个杰森配置文件的绝对路径是不是给这个,呃,这个命令传进来啊,对吧,那是不是也就是把它传给他了,对不对,就是这么个逻辑,OK啊好了,那这实际上就是export date这个函数的核心逻辑,其实很简单,这个函数说白了就是干啥的,是不是就是专门用。
66:02
来执行咱们这个带圈的导出命令的呀,对吧,是这样的,然后呢,你需要给它传一些参数,做一些准备啊好了,那这个函数咱们就说完了,说完之后咱接下来继续往下看,看一看我们现在这个脚本将来到底怎么用啊来往下走你会发现就是咱们整个脚本在这儿,它只接收几个参数。其实整个脚本只接收一个参数,对不对,那这个参数呢,你要传的应该是什么呢?其实就是一个表名,但是用不用传日期。这个用不用传世器,不用为啥,很简单,因为因为咱们在使用带圈往MYSQ里边导数据的时候,我们只要导,导的就是啥,就是全表,对吧?所以你只要告诉他你要导哪张表是不是就完事了,对吧?跟日期无关啊,那所以在这呢,我们只接受一个彩数,就是表明,那你比如说现在我传了一个ADS new bear state对不对?那你说你下面的执行逻辑应该是什么呢?是不是就应当是调用port date这个函数,也就是调谁,是不是就调这个函数啊对吧?好,那调完它之后呢,你需要给它传两个参数吧,第一个参数什么是不是就是你这个表它的接分配置文件对不对?那是不是咱现在已经给它传进来了对不对,那还得传谁?
67:10
还得传就是你这个表在HD上的路径嘛,对吧?好,那后边第二参数是不是就是它的那个路径对不对,OK,那这样一来,那这个表的数据就能导出去了,OK,好,那下边呢,是不是就是传哪张表的表明我就导哪张表的数据啊对吧?那如果我传O呢。是不是就是导所有的表对吧?哎,就这么个逻辑,好了多同学,那截止到现在呢,那咱这个脚本,那它的这个核心的内容咱就说完了,好其实比较简单啊,好完成之后看好那说完之后呢,我们现在呢,Ctrl a ctrl c把它全部粘出来之后呢,我给它创建一下就完事了啊好,那这个脚本咱们给它起一个名字,我们叫什么名比较合适,咱们叫啥名比较合适啊,这个是从哪把数据导到哪,是从have把数据导到这个买骚货里边,对不对?那所以我们这应该叫什么呢?叫做咱们就叫HDFS吧,因为虽然咱们是从have导,但其实说白了咱们用的是HD FS reader对吧?那所以我们叫hdfs h FS to哪呢,To my,然后点SSH就完事了啊好,那这个完成之后,把全部内容翻进来之后呢,我们shift内好了,那之后对它加上这个直接权限,趁mode加s HD FS my circle.sh好,那现在咱们就可以调用这个脚本了,怎么调用,是不是直接点杠HD FS to my circle传一个参数就行了,是不是传一个奥就行了,不用传日期对吧?好,那现在我直接回车,那当然同学们啊,刚才我们在测试的时候已经往买S里边是不是导过一两秒的数据了,对吧?那我再重新再导一遍,会不会有问题呢?
68:37
会有问题吗?是不会有问题的,对吧,是不会有问题的,因为咱们这是不是用的是那个re replace那种写入模式啊,对吧?诶他会把原来的替换掉,哎,这个不会重复啊好了,那这个脚本呢,他可能需要一点时间,我们暂时就先不等它了,让他自己先跑着,一会儿咱们简单的查一下结果就可以了啊好,视频我停一下。
我来说两句