2。4关系建模与维度建模 关系模型 关系模型主要应用与OLTP系统中,为了保证数据的一致性以及避免冗余,所以大部分业务系统的表都是遵循第三范式的。 维度模型 维度模型主要应用于OLAP系统中,因为关系模型虽然冗余少,但是在大规模数据,跨表分析统计查询过程中,会造成多表关联,这会大大降低执行效率。 所以把相关各种表整理成两种:事实表和维度表两种。所有维度表围绕着事实表进行解释。 OLAP与OLTP对比 雪花模型、星型模型和星座模型 在维度建模的基础上又分为三种模型:星型模型、雪花模型、星座模型 第3章数仓搭建 3。0配置Hadoop支持Snappy压缩 1)将编译后支持Snappy压缩的Hadoopjar包解压缩,并将libnative目录中所有文件上传到hadoop102的optmodulehadoop2。7。2libnative目录,并分发到hadoop103hadoop104。 2)重新启动Hadoop。 3)检查支持的压缩方式〔kgghadoop102native〕hadoopchecknativehadoop:trueoptmodulehadoop2。7。2libnativelibhadoop。sozlib:truelib64libz。so。1snappy:trueoptmodulehadoop2。7。2libnativelibsnappy。so。1lz4:truerevision:99bzip2:false 3。1业务数据生成 3。1。1建表语句 1)通过SQLyog创建数据库gmall 2)设置数据库编码 3)导入建表语句(1建表脚本) 4)重复步骤3的导入方式,依次导入:2商品分类数据插入脚本、3函数脚本、4存储过程脚本。 3。1。2生成业务数据 1)生成业务数据函数说明initdata(dodatestringVARCHAR(20),orderincrnumINT,userincrnumINT,skunumINT,iftruncateBOOLEAN):参数一:dodatestring生成数据日期参数二:orderincrnum订单id个数参数三:userincrnum用户id个数参数四:skunum商品sku个数参数五:iftruncate是否删除数据 2)案例测试: (1)需求:生成日期2019年2月10日数据、订单1000个、用户200个、商品sku300个、删除原始数据。 CALLinitdata(20190210,1000,200,300,TRUE); (2)查询生成数据结果SELECTfrombasecategory1;SELECTfrombasecategory2;SELECTfrombasecategory3;SELECTfromorderinfo;SELECTfromorderdetail;SELECTfromskuinfo;SELECTfromuserinfo;SELECTfrompaymentinfo; 3。2业务数据导入数仓 3。2。1Sqoop安装 详见尚硅谷大数据技术之Sqoop 3。2。2Sqoop导入命令optmodulesqoopbinsqoopimportconnectusernamepasswordtargetdirdeletetargetdirnummappersfieldsterminatedbyquery2andCONDITIONS; 3。2。3分析表 3。2。4Sqoop定时导入脚本 1)在homekggbin目录下创建脚本sqoopimport。sh 〔kgghadoop102bin〕vimsqoopimport。sh在脚本中填写如下内容!binbashdbdate2echodbdatedbnamegmallimportdata(){optmodulesqoopbinsqoopimportconnectjdbc:mysql:hadoop102:3306dbnameusernamerootpassword000000targetdirorigindatadbnamedb1dbdatedeletetargetdirnummappers1fieldsterminatedbyquery2andCONDITIONS;}importskuinfo(){importdataskuinfoselectid,spuid,price,skuname,skudesc,weight,tmid,category3id,createtimefromskuinfowhere11}importuserinfo(){importdatauserinfoselectid,name,birthday,gender,email,userlevel,createtimefromuserinfowhere11}importbasecategory1(){importdatabasecategory1selectid,namefrombasecategory1where11}importbasecategory2(){importdatabasecategory2selectid,name,category1idfrombasecategory2where11}importbasecategory3(){importdatabasecategory3selectid,name,category2idfrombasecategory3where11}importorderdetail(){importdataorderdetailselectod。id,orderid,userid,skuid,skuname,orderprice,skunum,o。createtimefromorderinfoo,orderdetailodwhereo。idod。orderidandDATEFORMAT(createtime,Ymd)dbdate}importpaymentinfo(){importdatapaymentinfoselectid,outtradeno,orderid,userid,alipaytradeno,totalamount,subject,paymenttype,paymenttimefrompaymentinfowhereDATEFORMAT(paymenttime,Ymd)dbdate}importorderinfo(){importdataorderinfoselectid,totalamount,orderstatus,userid,paymentway,outtradeno,createtime,operatetimefromorderinfowhere(DATEFORMAT(createtime,Ymd)dbdateorDATEFORMAT(operatetime,Ymd)dbdate)}case1inbasecategory1)importbasecategory1;;basecategory2)importbasecategory2;;basecategory3)importbasecategory3;;orderinfo)importorderinfo;;orderdetail)importorderdetail;;skuinfo)importskuinfo;;userinfo)importuserinfo;;paymentinfo)importpaymentinfo;;all)importbasecategory1importbasecategory2importbasecategory3importorderinfoimportorderdetailimportskuinfoimportuserinfoimportpaymentinfo;;esac 2)增加脚本执行权限〔kgghadoop102bin〕chmod777sqoopimport。sh 3)执行脚本导入数据〔kgghadoop102bin〕sqoopimport。shall20190210 4)在SQLyog中生成2019年2月11日数据CALLinitdata(20190211,1000,200,300,TRUE); 5)执行脚本导入数据〔kgghadoop102bin〕sqoopimport。shall20190211 3。2。5Sqoop导入数据异常处理 1)问题描述:执行Sqoop导入数据脚本时,发生如下异常java。sql。SQLException:Streamingresultsetcom。mysql。jdbc。RowDataDynamic65d6b83bisstillactive。Nostatementsmaybeissuedwhenanystreamingresultsetsareopenandinuseonagivenconnection。Ensurethatyouhavecalled。close()onanyactivestreamingresultsetsbeforeattemptingmorequeries。atcom。mysql。jdbc。SQLError。createSQLException(SQLError。java:930)atcom。mysql。jdbc。MysqlIO。checkForOutstandingStreamingData(MysqlIO。java:2646)atcom。mysql。jdbc。MysqlIO。sendCommand(MysqlIO。java:1861)atcom。mysql。jdbc。MysqlIO。sqlQueryDirect(MysqlIO。java:2101)atcom。mysql。jdbc。ConnectionImpl。execSQL(ConnectionImpl。java:2548)atcom。mysql。jdbc。ConnectionImpl。execSQL(ConnectionImpl。java:2477)atcom。mysql。jdbc。StatementImpl。executeQuery(StatementImpl。java:1422)atcom。mysql。jdbc。ConnectionImpl。getMaxBytesPerChar(ConnectionImpl。java:2945)atcom。mysql。jdbc。Field。getMaxBytesPerCharacter(Field。java:582) 2)问题解决方案:增加如下导入参数java。sql。SQLException:Streamingresultsetcom。mysql。jdbc。RowDataDynamic65d6b83bisstillactive。Nostatementsmaybeissuedwhenanystreamingresultsetsareopenandinuseonagivenconnection。Ensurethatyouhavecalled。close()onanyactivestreamingresultsetsbeforeattemptingmorequeries。atcom。mysql。jdbc。SQLError。createSQLException(SQLError。java:930)atcom。mysql。jdbc。MysqlIO。checkForOutstandingStreamingData(MysqlIO。java:2646)atcom。mysql。jdbc。MysqlIO。sendCommand(MysqlIO。java:1861)atcom。mysql。jdbc。MysqlIO。sqlQueryDirect(MysqlIO。java:2101)atcom。mysql。jdbc。ConnectionImpl。execSQL(ConnectionImpl。java:2548)atcom。mysql。jdbc。ConnectionImpl。execSQL(ConnectionImpl。java:2477)atcom。mysql。jdbc。StatementImpl。executeQuery(StatementImpl。java:1422)atcom。mysql。jdbc。ConnectionImpl。getMaxBytesPerChar(ConnectionImpl。java:2945)atcom。mysql。jdbc。Field。getMaxBytesPerCharacter(Field。java:582)