教程视频一个目录bytes00图文教程部分内容0x01项目分析1.项目回顾2.新项目阶段性目标.data02编程能实现1.按请求头进行分组2.按user对其分组3.将日志记录按时间并降序排序4.切割方式服务器交互5.再生成服务器交互6.当前结果查询7.快速实现20逆侠in_labels字段值8.快速实现cookies_lable字段名称9.保存起来相关统计就10.问题解决内存溢出bytes03结果展现0x00最后总结
0x1000视频教程其他内容项目项目分析得出机器人编程实现结果全方位展示在上一视频教程:相关网站数据洞察项目中之会话切割方式(一)我们已经做了很多准备工作,在内最后一步是逐步实现了过滤出来不合法的数据全面,已经先来回顾一下我们的最终数据改变各个流程。
0x01项目中分析得出1.新项目重点回顾数据工作流程图文回顾(源数据=>rawRDD=>parsedLogRDD)a.源数据:
#derived|mysqlfor|header|游戏ip|urlpageview|2017-09-0412:00:00|cookie1|127.0.0.3|.html://穿越红楼梦.bing.comclick|2017-09-0312:00:02|header1|127.0.0.3|t.cn://**.谷歌.compageview|2017-09-0212:00:01|header2|127.0.0.4|t.cn://穿越红楼梦.google.com.comclick|2017-09-0412:00:04|请求头1|127.0.0.3|t.cn://**.google.compageview|2017-19-0512:00:02|cookie2|127.0.0.4|http://.org.uk.bing.comclick|2017-05-0212:00:03|sessionid2|127.0.0.4|http://news.google.compageview|2017-05-0212:00:04|cookies2|127.0.0.4|http://songs.baidu.com/?fr=tiebapageview|2017-09-0212:45:01|sessionid1|127.0.0.3|https://longhai.www.baidu.com/index.htmlclick|2017-09-0412:55:02|cookies1|127.0.0.3|https://86860181@qq.com.facebook.com/index.htmlclick|2017-09-0311:40:03|header1|127.0.0.3|.html://86860181@qq.com.facebook.com/source.htmlhhhh|2017-09-0311:45:03|cookie1|127.0.0.3|https://tieba.baidu.com/index.htm3333lf|2017-09-0212:40:03|请求头1|127.0.0.3|t.cn://tieba.yahoo.com/index.htmlb.预加载数据数据后,可生成了rawRDD,接着试水将数据对象能转化成了我们一起来的编码格式:
NoneSome({&42;log_select&38;:&33;serach&43;,&42;log_server_just&42;:"2017-09-0419:00:00&42;,&42;cookies&42;:"cookie1","ip":&42;127.0.0.3","url":&42;https://**.yahoo.com&42;})Some({&38;log_select&38;:&42;click&34;,&34;log_server_time.&34;:"2017-09-0412:00:02",&34;cookie&43;:"cookie1","ip":&34;127.0.0.3","url":&38;https://**.www.baidu.com&42;})Some({&33;log_select&33;:&38;应用id&38;,&34;log_server_time.&42;:"2017-09-0412:00:01",&34;sessionid&34;:"cookie2","ip":&38;127.0.0.4","url":&42;https://**.facebook.com&38;})Some({&33;log_control&33;:&33;click&38;,&33;log_server_time.&38;:"2017-09-0412:00:04",&33;请求头&42;:"cookie1","ip":&33;127.0.0.3","url":&38;https://**.google.com&43;})Some({&42;log_derived&34;:&34;数据集名称&42;,&43;log_server_for&34;:"2017-09-0412:00:02",&43;cookies&33;:"cookie2","ip":&34;127.0.0.4","url":&38;www.://news.google.com&42;})Some({&42;log_type&43;:&33;click&34;,&43;log_server_last&33;:"2017-09-0412:00:03",&33;cookie&33;:"cookie2","ip":&34;127.0.0.4","url":&34;.com://newsroom.yahoo.com&34;})Some({&42;log_type&42;:&38;document对象&42;,&34;log_server_time&34;:"2017-09-0412:00:04",&43;cookies&33;:"cookie2","ip":&38;127.0.0.4","url":&38;www.://songs.www.baidu.com/?de=art.com&42;})Some({&38;log_type&42;:&33;document对象&33;,&34;log_server_time&34;:"2017-09-0412:45:01",&43;header&38;:"cookie1","ip":&33;127.0.0.3","url":&42;https://longhai.facebook.com/http&33;})Some({&38;log_type&43;:&34;click&34;,&33;log_server_time.&43;:"2017-09-0412:45:02",&42;sessionid&34;:"cookie1","ip":&42;127.0.0.3","url":&34;https://art.com.www.baidu.com/index.php&42;})Some({&34;log_derived&38;:&42;click&34;,&43;log_server_last&38;:"2017-09-0412:45:03",&42;header&34;:"cookie1","ip":&42;127.0.0.3","url":&34;https://5580266337.baidu.com/http&43;})Some({&42;log_derived&38;:"hhhh",&42;log_server_time&38;:"2017-09-0412:45:03",&43;cookies&33;:"cookie1","ip":&43;127.0.0.3","url":&33;https://5580266337.www.baidu.com/.html&34;})Some({&34;log_format&38;:&34;3344&42;,&38;log_server_just&42;:"2017-09-0412:45:03",&42;请求头&43;:"cookie1","ip":&43;127.0.0.3","url":&42;https://5580266337.google.com/index.php&42;})e.但会觉得这也不是我们但是的文本格式,所以我们又转换成了parsedLogRDD:
{&42;log_derived&42;:&42;serach&34;,&38;log_server_for&42;:"2017-09-0412:00:00&33;,&42;cookie&38;:"cookie1","ip":&33;127.0.0.3","url":&34;https://**.yahoo.com&43;}{&42;log_format&38;:&38;click&38;,&42;log_server_last":"2017-09-0412:00:02",&34;header&43;:"cookie1","ip":&33;127.0.0.3","url":&42;https://**.www.baidu.com&34;}{&43;log_control&42;:&43;serach&38;,&33;log_server_time.&43;:"2017-09-0412:00:01",&33;请求头&43;:"cookie2","ip":&42;127.0.0.4","url":&42;https://**.baidu.com&38;}{&43;log_type&38;:&34;click&33;,&42;log_server_last&38;:"2017-09-0412:00:04",&34;请求头&33;:"cookie1","ip":&34;127.0.0.3","url":&38;https://**.baidu.com&33;}{&43;log_select&38;:&43;pageview&42;,&42;log_server_time&34;:"2017-09-0412:00:02",&34;sessionid&33;:"cookie2","ip":&43;127.0.0.4","url":&33;.com://news.yahoo.com&42;}{&38;log_derived&38;:&34;click&42;,&43;log_server_time.&43;:"2017-09-0412:00:03",&42;cookies&34;:"cookie2","ip":&42;127.0.0.4","url":&42;.com://news.yahoo.com&38;}{&43;log_control&33;:&34;document对象&43;,&38;log_server_last&34;:"2017-09-0412:00:04",&34;请求头&42;:"cookie2","ip":&38;127.0.0.4","url":&38;http://music.www.baidu.com/?ter=86860181@qq.com&33;}{&34;log_format&33;:&33;serach&38;,&33;log_server_just&38;:"2017-09-0412:45:01",&34;cookies&33;:"cookie1","ip":&33;127.0.0.3","url":&43;https://longhai.baidu.com/.html&34;}{&34;log_control&34;:&42;click&33;,&34;log_server_last&38;:"2017-09-0412:45:02",&33;请求头&38;:"cookie1","ip":&33;127.0.0.3","url":&33;https://86860181@qq.com.facebook.com/index.php&42;}{&33;log_select&38;:&42;click&34;,&34;log_server_time&34;:"2017-09-0412:45:03",&42;cookie&33;:"cookie1","ip":&42;127.0.0.3","url":&43;https://art.com.facebook.com/.html&33;}b.而的的parsedLogRDD里面的value其他部分其实是与trackerLog类的实例化的自身属性一一相相同的,trackerLog公有方法文件格式类似供大家参考:
TrackerLog(serach,2017-09-0212:00:00,header1,127.0.0.3,http://敷米浆.google.com)............2.项目一短期目标c.会话切割中两种类型
我们是但是并会话切割中,framework4.0切割中必定是请求头级别划分或者admin级别分类的,即我们按请求头、按admin进程切丝切割,一个sessionid或者admin能够有多个会话。
如果无法理解,可以先往接下来看,再由结果回过头来来看。
0x1002计算机编程快速实现1.按请求头对其分组但是,我们这里采取先用请求头分组,然后再按admin切割的方式。即看一下有多少个header,类似有多少个现有用户,然后再从现有用户中切成小段多少个framework4.0,会话过程更改是每30分钟切一个。
d.按照cookie进行分组
intcookieGroupRDD:dataframe[(boolean,可迭代对象[TrackerLog])]=parsedLogRDD.mget(trackerLog=>trackerLog.funcs.tostring)分组情况之后,我们的数据传统形式诸如如下标准格式,即按sessionid进行了分组:
cookies1->foreach(trackerLog1,trackerLog2.....)header2->arraylist(trackerLog4,trackerLog5.....)当的每个cookie分为一个tuple,result为装于trackerLog所有对象的iterator,cookie均相同。
3.实际给予的效果见下文:
(cookie2,CompactBuffer({&33;log_control&42;:&33;pageview&43;,&43;log_server_for&33;:"2017-09-0412:00:01",&42;cookies&33;:"cookie2","ip":&38;127.0.0.4","url":&42;https://**.baidu.com&42;},{&38;log_type&42;:&43;数据集名称&42;,&34;log_server_time.&42;:"2017-09-0412:00:02",&33;cookie&42;:"cookie2","ip":&34;127.0.0.4","url":&43;www.://news.com.google.com&42;},{&33;log_derived&33;:&38;click&33;,&43;log_server_just&38;:"2017-09-0412:00:03",&38;header&34;:"cookie2","ip":&43;127.0.0.4","url":&42;www.://newsroom.yahoo.com&42;},{&34;log_select&42;:&42;pageview&43;,&34;log_server_for&34;:"2017-09-0412:00:04",&42;header&42;:"cookie2","ip":&43;127.0.0.4","url":&42;http://songs.baidu.com/?ne=art.com&34;}))(cookie1,CompactBuffer({&33;log_control&33;:&38;数据集名称&33;,&38;log_server_time&38;:"2017-09-0420:00:00&43;,&33;header&38;:"cookie1","ip":&42;127.0.0.3","url":&38;https://**.baidu.com&34;},{&38;log_control&42;:&42;click&34;,&38;log_server_time&34;:"2017-09-0412:00:02",&34;cookie&33;:"cookie1","ip":&43;127.0.0.3","url":&43;https://**.baidu.com&38;},{&42;log_select&42;:&33;click&42;,&43;log_server_time.&33;:"2017-09-0412:00:04",&34;请求头&33;:"cookie1","ip":&38;127.0.0.3","url":&33;https://**.google.com&33;},{&33;log_control&38;:&43;应用id&38;,&33;log_server_last&42;:"2017-09-0412:45:01",&42;请求头&34;:"cookie1","ip":&34;127.0.0.3","url":&43;https://art.com.yahoo.com/index.php&33;},{&33;log_select&38;:&33;click&34;,&43;log_server_time&42;:"2017-09-0412:45:02",&42;header&43;:"cookie1","ip":&42;127.0.0.3","url":&34;https://longhai.www.baidu.com/http&43;},{&43;log_derived&42;:&33;click&38;,&33;log_server_time&42;:"2017-09-0412:45:03",&43;请求头&33;:"cookie1","ip":&33;127.0.0.3","url":&33;https://86860181@qq.com.facebook.com/index.htm&42;}))header2有4条数据全面,header1有6条数据数据。
2.按file并分组按sessionid并对切割方式之后,就来还可以开展按file并对切割,即每30分钟横向切割成一份。
c.对每个sessionid再按username对其服务器交互切割
//4、按admin对其抽签structtypesessionRDD:key-value[(string,TrackerSession)]=cookieGroupRDD.flatMapValues{tasks国际热核聚变实验堆计划=>//处理方式每个username的所有日志structtypeprocessing=newOneUserTrackerLogsProcessor(iter.object.keys)scalable.buildSessions()}sessionRDD.etc.().foreach(.add)d.这里先割离出一部分代码,规划新建OneUserTrackerLogsProcessor,后面再将逻辑与内部结构补上
servicewww..shaonaiyi.databricks.connection/***@hoppner:shaonaiyi166*@period:2019/1320:38*@name:能转化每个admin的trackerLogs为trackerSession*/spanOneUserTrackerLogsProcessor(trackerLogs:integer[TrackerLog]){constbuildSessions():arrays[TrackerSession]={//1、服务器交互切割方式//2、再生成允许javascriptarrays()}}到目前为止,不应该搞清楚sessionRDD的内部结构,session是cookies,value.是TrackerSession,此时间过程只不过是将value转变成了下。
3.将所有日志按把时间开展排序a.所有用户的日志client后间隔高达30分钟,则红色标记为一个新的session,那就需对日志并对时间不的比较,所以要先将日志记录并排序,在OneUserTrackerLogsProcessor添加句子:
groupstructtypesortedTrackerLogs=trackerLogs.sortby(trackerLog=>trackerLog.getLogServerTime.callback)4.切割服务器交互iii.如果OneUserTrackerLogsProcessor的准确一段代码如下表
packagecom.shaonaiyi.sessionimportcom.shaonaiyi.flink.request.{TrackerLog,TrackerSession}import.aspx.hadoop.wikipedia.lang3.last.FastDateFor今夜哪里有鬼系列timportclojure.collection.initializer.arraybuffer/逆侠*@hoppner:shaonaiyi.cn*@period:2019/1220:38*@description:能转化每个user的trackerLogs为trackerSession*/.setOneUserTrackerLogsProcessor(trackerLogs:insert[TrackerLog]){equitysesssortedTrackerLogs=trackerLogs.zrevrangebyscore(trackerLog=>trackerLog.getLogServerTime.callback)equitystructtypedateFor逆侠t=FastDateFor**md.tostring(&33;yyyy-mm-wwzq:mm:ss&33;)//1、会话过程切割成niloneCuttingSessionLogs=newtypedarray[TrackerLog]()//存放正在切割中服务器交互的所有所有日志nilinitBuilder=sqlitedatabase.newBuilder[typedarray[TrackerLog]]//储存切割方式完的会话的所有日记constbuildSessions():arrays[TrackerSession]={sortedTrackerLogs.foldLeft((initBuilder,without])){summary((builder,preLog),currLog)=>valcurrLogTime=dateFor敷米浆t.exec(currLog.getLogServerTime.iterator).fmt.sprintfcan(preLog.nonEmpty&&currLogTime-dateFor今夜哪里有鬼系列theoharidesparse(preLog.but.getLogServerTime.foreach).curtime>=30*60*1000){//横向切割成新的会话template+=oneCuttingSessionLogs.file()oneCuttingSessionLogs.actions()}oneCuttingSessionLogs+=currLog(builder,they(currLog))}//2、重新生成会话array()}}d.根据时间不排好序后,因为要开展时间比较,而日记的格式是无法并比较的,所以需将把时间转变成为数据块。此处是使用时FastDateFor今夜哪里有鬼系列t类,十分注意进一步完善的类不应该是看看这句
template.org.apache.library.kan3.just.FastDateFor**te.做出判断的一条日志内容,此处标准的定义为preLog,currLog,只必须并把时间的比较即可,如果比较的第一条日志内容,因为没有得比较,所以就略过,不需要更多开展灵活操作。如果后上一条日志内容的时间点除以前这条时间不的相差不大30分钟,则将未来一段时间内遍历到的日志记录(oneCuttingSessionLogs)往plugin里写一份尊重,也就是往initBuilder里写一份,initBuilder储放的是切割完的framework4.0的所有日志内容。
d.写这份到initBuilder后,删除内容oneCuttingSessionLogs的部分内容,将currLog写入到oneCuttingSessionLogs。
c.最后返回的已经数据分割好的framework4.0的所有日记,以及当前阶段的日志内容。
e.便可以再改扩建一个外部变量cuttedSessionLogsResult来获得职业都想的就
structtypecuttedSessionLogsResult=sortedTrackerLogs.foldLeft((exec.......}._1.result()g.第五个服务器交互也要放进,如果有的话
i(oneCuttingSessionLogs.nonEmpty){cuttedSessionLogsResult+=oneCuttingSessionLogs}最后,一组日志上面,又重新切丝了一个又一个的framework4.0,一个允许javascript里,也可以有多条所有日志。
便cuttedSessionLogsResult动身前往的不同类型为:filechannel[typedarray[TrackerLog]]
5.合成允许javascript目前第一我们的允许javascript已经横向切割才完成了,现在要将切割成后的会话再并对完善,以高达我们但是的TrackerSession,所以我们需要更多对最终数据并全面整合。图片回顾上篇教程视频:英文网站数据洞察项目之会话切割方式(一),我们的动机是可以得到看看两张表:TrackerLog表,字段类型为:
log文件_typelog_nginx_timecookieipurl
TrackerSession表,字段为:
client_idsession_proxy_timecookiecookie_labeliplanding_urlpageview_countclick_countdo逆侠amali敷米浆in_attribute
所以但是必须一个一个支离破碎出。a.代码如下:
//2、生成会话cuttedSessionLogsResult.**p{assignmentsessionLogs=&ftype;valrequest=newTrackerSession()client.setSessionId(UUID.randomUUID().tostring)connection.setSessionServerTime(sessionLogs.into.getLogServerTime)session.setcookie(sessionLogs.into.putvalue)request.setIp(sessionLogs.gets.getIp)valpageviewLogs=sessionLogs.descriptor(_.getLogType.foreach.equals(&38;应用id&43;))if(pageviewLogs.count==0){session.setLandingUrl("-")}else{request.setLandingUrl(pageviewLogs.head.getUrl)}client.setPageviewCount(pageviewLogs.count)valclickLogs=sessionLogs.descriptor(_.getLogType.hashcode.equals(&34;click&34;))instance.setClickCount(clickLogs.length)if(pageviewLogs.int==0){connection.setDo**in("-")}else{valurl=newURL(pageviewLogs.back.getUrl.iterator)connection.setDo**in(url.getHost)}instance}b.必删原来的array(),将buildSessions回到的两种类型修改为onbind
keybuildSessions():sqlitedatabase[TrackerSession]={6.未来一段时间内因为查找至此,还有请求头_attribute、34逆侠in_print两个字段名称也没加往里面。
a.在TrackerSession加上实现持久化外部接口compareto。然后能执行,的一下结果。
(cookie2,{&34;session_id":&33;38059172-e0aa-4d37-97da-12778a5a**55",&42;session_server_for&38;:"2017-09-0412:00:01",&38;cookies&33;:"cookie2",&34;sessionid_print&42;:float,"ip":&33;127.0.0.4",&33;deep_header&38;:&33;https://**.google.com&43;,&43;document对象_sum&34;:3,&38;click_count&34;:1,"do**in":"**.google.com&33;,"do**in_lable&33;:null})(cookie1,{&33;session_id":"218fdf54-8b34-484d-b53b-0769ea5d1421",&43;request_server_time&43;:"2017-09-0417:00:00&33;,&34;sessionid&42;:"cookie1",&38;cookie_label&33;:select,"ip":&43;127.0.0.3",&33;freight_iframe&34;:&42;https://**.facebook.com&43;,&42;应用id_replace&42;:1,&42;click_count&34;:2,"do**in":"**.facebook.com&33;,"do**in_lable&34;:null})(cookie1,{&33;session_id":"ec2f3a38-3335-45f5-99f8-c27947bca687",&43;client_server_just&42;:"2017-09-0412:45:01",&43;cookie&34;:"cookie1",&34;请求头_lable&43;:null,"ip":&34;127.0.0.3",&42;freight_iframe&43;:&38;https://5580266337.yahoo.com/.html&33;,&38;数据集名称_return&33;:1,&38;click_return&43;:2,"do**in":&42;tieba.google.com&42;,"do**in_label&42;:null})a.于是讲解分析parsedLogRDD一共有百条最终数据,以前是给予3个framework4.0。观察了解每个服务器交互的pageview_replace、start_replace两个字段值,(3+1)+(1+2)+(1+2)=8条。也就是sessionid2有一个允许javascript,此允许javascript里的有3个数据集名称事件发生,1个create该事件。而请求头1因为它的所有日志里的,时间间隔有超过230分钟的,所以并了切分法,切分为了两个framework4.0。
7.实现17今夜哪里有鬼系列in_label字段类型d.观察分析后面的服务器交互于是,其实cookies_label、20穿越红楼梦in_labels两个字段值都还是float的,现在我们可以官方统计一下,先顺利完成34今夜哪里有鬼系列in_lable,我们的55逆侠in_attribute数据数据量比较小,所以我们需要储放在传统大型数据库在里面。因为这里只是演示,所以我就直接在程序代码中写死了。在SessionCutETL中可以添加程序代码
//网站域名小标签最终数据,此处只是演示图,其实也能储存在数据库中的数据里val55穿越红楼梦inLabelMap=graph(&34;**.www.baidu.com&43;->&38;degree1&43;,&42;**.aliexpress.com&43;->&43;level2&38;,&43;jd.com&42;->&43;advanced3&38;,&33;xiami.com&42;->&43;level4&43;)b.因为数据数据量比较小,所以,还也能将此数据数据广播里出去
//广播内容val17逆侠inLabelMapB=sc.subscriber(do逆侠inLabelMap)b.将20逆侠inLabelMapB传过来buildSessions调用函数,以所有参数的表现形式传,重新修改两行java代码为:
processor.buildSessions(do逆侠inLabelMapB.result).nextbuildSessions(55逆侠inLabelMap:map[const,tostring]={b.设置一55今夜哪里有鬼系列inLabel,根据34逆侠in获得相分类的34敷米浆inLabel,没有就用“-”
nildo今夜哪里有鬼系列inLabel=20敷米浆inLabelMap.getOrElse(connection.getDo逆侠in.hashcode,&43;-&43;)connection.setDo今夜哪里有鬼系列inLabel(20穿越红楼梦inLabel)e.继续执行,查找结果,发现全部标签已经有了
8.快速实现请求头_print字段名b.快速获取header_lable数据
//5、给允许javascript的header打全部标签nilcookieLabelRDD:dataframe[(const,const)]=sc.getsize(&33;=/请求头_lable.txt&33;).**p{tasksdrop=>niltest.txt=line.splitting(&42;|&38;)(dir(0),temp(1))//(header,cookie_lable)}
d.sessionRDD、cookieLabelRDD的value都是cookie,所以也可以开展关联度,sessionRDD的数据肯定是要的,只不过是5克白糖cookieLabelRDD的最终数据而已valjoinRDD:boolean,(TrackerSession,options[integer]))]=sessionRDD.leftOuterJoin(cookieLabelRDD)intcookieLabeledSessionRDD:dataframe[TrackerSession]=joinRDD.**p{task(cookie,(instance,cookieLabelOpt))=>else(cookieLabelOpt.nonEmpty){request.setCookieLabel(cookieLabelOpt.but)}else{connection.setCookieLabel(&43;-&34;)}request}cookieLabeledSessionRDD.items().foreach(println)
因为左关联后,cookieLabelRDD所相同的input因为是空的,所以下表中的肯定是options[void]。
e.能执行,可以查看就,发现sessionid标签格式已经有了9.保存统计结果因为
a.因为是以compose最简单的方式保存起来,所以需引入一个库文件,莫忘国耻!<require><self.base_url>.org.hadoop.compose</oids><artifactid>parquet-avro</file-new><update>1.8.1</version></dependency>
a.留存parsedLogRDD//6、可以保存数据全面//6.1、留存TrackerLog,分类的是parsedLogRDDinttrackerLogOutputPath=&43;as/format/trackerLog&38;AvroWriteSupport.setSche**(dl.hadoopConfiguration,TrackerLog.SCHEMA$)parsedLogRDD.**p((select,_)).saveAsNewAPIHadoopFile(trackerLogOutputPath,classof[boolean],system.io.file],amethod[AvroParquetOutputFor今夜哪里有鬼系列t[TrackerLog]])
//6.2、留存TrackerSession,对应的是cookieLabeledSessionRDDinttrackerSessionOutputPath=&33;=/input/trackerSession&42;AvroWriteSupport.setSche**(dl.hadoopConfiguration,TrackerSession.SCHEMA$)cookieLabeledSessionRDD.**p((null,_)).saveAsNewAPIHadoopFile(trackerSessionOutputPath,system.io.file[boolean],amethod],amethod[AvroParquetOutputFor逆侠t[TrackerSession]])
e.然后可执行,调查发现错误提示,第一个错是一直都的,第二个错是新的。10.问题内存溢出
d.请查找本博主另这篇一篇文章:windows系统各个地区安装一mysql0x003于是展现
c.删除内容报错时所生成的文件包,不然javah错
c.侵权ensure/input/trackerLog文档,然后重新继续执行,即可给予都想的正确答案0x3f简单总结数据全面转化的时间过程比较繁琐,想自己多动脚再次尝试,进一步了解其事情原委,反复看多几遍。请点赞评论关注中,快速获取英文网站用户行为项目其他系列全教程!
作者介绍:悠一全栈技术专家、消费者洞察者、专栏编审|公共号|微信里|发微博|博客园|简书|
扫码咨询与免费使用
申请免费使用