




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1基本介绍1.1简介RHadoop是运行R语言的Hadoop分布式计算平台的简称。要认识Rhadoop首先我们分别来认识R语言和Hadoop。Hadoop已经成名好多年了,它是Apache软件基金会旗下的一个JAVA开源分布式计算平台,现已被各大互联网企业(包括Yahoo和Facebook等)用于大规模数据分布式存储与分布式计算。近年来随着云计算、大数据处理、数据挖掘等概念和应用越来越火,Hadoop更是名声大噪,各大企业对熟悉Hadoop体系架构和性能优化的人才需求也相当旺盛,人才缺口也相对加大。R语言可能对大多数人来说比较陌生,但是做数理统计、数据分析的人不会不知道R。R是一门主要运用于统计分析与绘图的编程语言和操作工具。和Matlab类似,R是一门高级脚本化编程语言,直接在命令行输入指令即可运行,无需编译链接。它可以进行高效的向量化运算,效率远高于传统的循环运算。另外,R是开源的,有大批杰出的工程师和程序员为R开发了许多好用的函数库和图形化工具,尤其在数理统计方面有大量成熟的开源的程序包。所以R是做数据挖掘、数据分析的廉价高效的方案。1.2功能Rhadoop是将R的强大统计分析能力和hadoop的大数据处理能力相结合,可由以下几项功能组成。R内置多种统计学及数字分析功能R的另一强项是绘图功能,制图具有印刷的素质,也可加入数学符号Hadoop分布式文件系统,高吞吐量的数据级别达到TB、PB甚至EBMapreduce高效并行计算1.3常用算法包Rhadoop中的数据挖掘算法均来自R语言(或者说R软件),常用算法包如下:1.3.1聚类• 常用的包:fpc,cluster,pvclust,mclust•基于划分的方法•基于划分的方法•基于层次的方法•基于模型的方法•基于密度的方法•基于画图的方法基于验证的方法:cluster.stats1.3.2分类.常用的包:rpart,party,randomForest,rpartOrdinal,tree,marginTree,maptree,survival.决策树:rpart,ctree.随机森林:cforest,randomForest.回归,Logistic回归,Poisson回归:glm,predict,residuals.生存分析:survfit,survdiff,coxph1.3.3关联规则与频繁项集.常用的包:arules:支持挖掘频繁项集,最大频繁项集,频繁闭项目集和关联规则DRM:回归和分类数据的重复关联模型.APRIORI算法,广度RST算法:apriori,drm.ECLAT算法:采用等价类,RST深度搜索和集合的交集:eclat1.3.4序列模式.常用的包:arulesSequences.SPADE算法:cSPADE1.3.5时间序列.常用的包:timsac.时间序列构建函数:ts.成分分解:decomp,decompose,stl,tsr1.3.6人工神经网络.nnet1.3.7支持向量机e1071
常用的包:BaseR,nlme方差分析:aov,anova密度分析:density假设检验:t.test,prop.test,anova,aov线性混合模型:lme主成分分析和因子分析:princomp1.3.9接入数据挖掘软件Weka算法包RWeka:通过这个接口,可以在R中使用Weka的所有算法。2系统架构RHadoop是R环境+hadoop环境,是实际上是在hadoop集群中安装了R环境,通过R的三个包rmr、rhdfs、rhbase(分别是对应Hadoop系统架构中的,MapReduce,HDFS,HBase三个部分),实现R对hadoop各个组件的调用,从而将R与hadoop平台结合,从而充分利用了R和hadoop各自的优势°Hadoop主要用来存储海量数据,R语言完成MapReduce算法,用来替代Java的MapReduce实现,将R丰富的算法模型赋予分布式并行计算能力。3适用场景Hadoop有海量数据存储能力和高效并行计算框架,但缺乏数据统计和建模能力,R语言可以为hadoop注入统计血脉,增强hadoop集群的数据统计分析和建模能力,R+Hadoop将实现高效的海量数据分析与挖掘技术。虽然hadoop软件家族中的mahout也可以实现机器学习算法的并行计算,但mahout的算法模型还是较少和不够成熟,并且本身是一个算法库,它缺少R语言(或者说R软件)的数据统计分析以及绘图能力,因而Rhadoop相比mahout有诸多优势。4优缺点分析4.1优缺点概览;数据计算能力说明优劣势利用hadoop;数据计算能力说明优劣势利用hadoop平台的优秀的大数据处理和分布式并行计算能力优势数据存储 利用hadoop平台的分布式文件系统存储 优势数据处理丰富的数据处理函数和扩展包,灵活的数据处理能力优势算法模型提供大量的成熟算法优势自动建模不提供灵活的参数设置等功能劣势可视化虽然提供绘图功能,但命令式编程,没有可视化UI。劣势经济性开源优势扩展性R语言本身扩展性较强,可以添加额外的包优势技术支持有官方开源社区支持优势学习成本涉及知识点较广、如需掌握java、linux、hadoop、R等劣势发展空间R和Hadoop的结合,发展空间广阔优势4・2主要优缺点说明所以如果让能R运行在Hadoop平台上可以说是如虎添翼,可以让数据分析人员,即能用到R丰富的程序包,又能借助Hadoop分布式运算、分布式存储的优势做海量数据的处理。但由于R+Hadoop还不够成熟,企业级应用依然缺乏成功案例,所以当实施R+Hadoop的应用时,还会碰到非常多的问题。5扩展性Hadoop的高扩展性和R语言的高扩展性决定rhadoop的高扩展性6实际案例6.1简单示例(WordCount的例子)使用rmr包和rhdfs包做个WordCount的试验。首先要启动Hadoop。system('start-all.sh')system('hadoopdfsadmin-safemodeleave')加载R包。require(rmr)require(rhdfs)rhdfs包会建议做一个初始化测试。hdfs.init()编写wordcount函数。wordcount<-function(input,output二NULL,split='[[:punct:][:space:]]+'){mapreduce(input二input,output=output,map二function(k,v)(v2=unlist(strsplit(x=v,split二split))v3=v2[v2!='']lapply(v3,function(w){keyval(w,1)})},reduce=function(k,vv)(keyval(k,sum(unlist(vv)))})}直接输入文本,转成HDFS文件,计数。lines<-c('thisisjustajoke,','andthatisjustanotherjoke,','wealllikethemverymuch,','becausetheyaresofunny.')lines_dfs<-to.dfs(lines)wc1<-wordcount(input=lines_dfs)data.frame(do.call(rbind,from.dfs(wc1)))keyvalTOC\o"1-5"\h\za1is2so1we1all1and1are1joke2just2like1much1that1them1they1this1very1funny1another1because16.2R实现MapReduce的协同过滤算法基于物品推荐的协同过滤算法介绍R本地程序实现R基于Hadoop分步式程序实现每一章节,都会分为”文字说明部分”和”代码部分”,保持文字说明与代码的连贯性。6.2.1基于物品推荐的协同过滤算法介绍文字说明部分:越来越多的互联网应用,都开始使用推荐算法(协同过滤算法)。根据用户活跃度和物品流行度,可以分为”基于用户的协同过滤算法”和”基于物品的协同过滤算法”。基于用户的协同过滤算法,是给用户推荐和他兴趣相似的其他用户喜欢的物品。基于物品的协同过滤算法,是给用户推荐和他之前喜欢的物品相似的物品。基于物品的协同过滤算法,是目前广泛使用的一种推荐算法,像Netflix,YouTube,Amazon等。算法主要分为两步:计算物品之间的相似度根据物品的相似度和用户的历史行为给用户生成推荐列表有关算法的细节请参考:”MahoutInAction”和”推荐系统实践”两本书。为开发方便,我们选择一组很小的测试数据集。测试数据,来自于"MahoutInAction”P49原第8行,3,101,2.5改为3,101,2.0每行3个字段,依次是用户ID,物品ID,对物品的评分代码部分:在服务上创建测试数据文件small.csv〜pwd/root/R〜vismall.csv1,101,5.01,102,3.01,103,2.52,101,2.02,102,2.52,103,5.03,101,2.03,104,4.03,105,4.53,107,5.04,101,5.04,103,3.04,104,4.54,106,4.05,101,4.05,102,3.05,103,2.05,104,4.05,105,3.55,106,4.0~lssmall.csv6.2.2R本地程序实现首先,通过R语言实现基于物品的协同过滤算法,为和RHadoop实现进行对比。这里我使用”MahoutInActic书里,第一章第六节介绍的分步式基于物品的协同过滤算法进行实现。Chapter6:Distributingrecommendationcomputations算法的思想:建立物品的同现矩阵建立用户对物品的评分矩阵矩阵计算推荐结果文字说明部分:建立物品的同现矩阵按用户分组,找到每个用户所选的物品,单独出现计数,及两两一组计数。例如:用户ID为3的用户,分别给101,104,105,107,这4个物品打分。(101,101),(104,104),(105,105),(107,107),单独出现计算各加1。(101,104),(101,105),(101,107),(104,105),(104,107),(105,107),两个一组计数各加1。把所有用户的计算结果求和,生成一个三角矩阵,再补全三角矩阵,就建立了物品的同现矩阵。如下面矩阵所示:[102] [103] [104] [105] [106] [107]
[102]3332110[103]4343120[104]4234221[105]2112211[106]2122120[107]1001101建立用户对物品的评分矩阵按用户分组,找到每个用户所选的物品及评分例如:用户ID为3的用户,分别给(3,101,2.0),(3,104,4.0),(3,105,4.5),(3,107,5.0),这4个物品打分。找到物品评分(3,101,2.0),(3,104,4.0),(3,105,4.5),(3,107,5.0)建立用户对物品的评分矩阵U3TOC\o"1-5"\h\z2.00.00.04.04.50.05.0矩阵计算推荐结果同现矩阵*评分矩阵=推荐结果代码部分:
#引用plyr包library(plyr)#读取数据集train<-read.csv(file="small.csv”,header=FALSE)names(train)<-c("user”,"item”,"pref")>trainuseritempref11015.011023.011032.521012.021022.521035.021042.031012.031044.031054.531075.041015.041033.041044.541064.051014.051023.051032.051044.051053.551064.0#计算用户列表usersUnique<-function(){users<-unique(train$user)users[order(users)]}#计算商品列表方法itemsUnique<-function(){items<-unique(train$item)items[order(items)]}
#用户列表users<-usersUnique()users[1]12345#商品列表items<-itemsUnique()items[1]101102103104105106107#建立商品列表索引index<-function(x)which(items%in%x)data<-ddply(train,.(user,item,pref),summarize,idx=index(item))>datauseritemprefidxTOC\o"1-5"\h\z1 101 5.0 11 102 3.0 21 103 2.5 32 101 2.0 12 102 2.5 22 103 5.0 32 104 2.0 43 101 2.0 13 104 4.0 43 105 4.5 53 107 5.0 74 101 5.0 14 103 3.0 34 104 4.5 44 106 4.0 65 101 4.0 15 102 3.0 25 103 2.0 35 104 4.0 45 105 3.5 55 106 4.0 6#同现矩阵cooccurrence<-function(data){n<-length(items)co<-matrix(rep(0,n*n),nrow=n)for(uinusers){idx<-index(data$item[which(data$user==u)])
m<-merge(idx,idx)for(iin1:nrow(m)){co[m$x[i],m$y[i]]=co[m$x[i],m$y[i]]+1}}return(co)}#推荐算法recommend<-function(udata=udata,co=coMatrix,num=0){n<-length(items)#allofprefpref<-rep(0,n)pref[udata$idx]<-udata$pref#用户评分矩阵userx<-matrix(pref,nrow=n)#同现矩阵*评分矩阵r<-co%*%userx#推荐结果排序r[udata$idx]<-0idx<-order(r,decreasing=TRUE)topn<-data.frame(user=rep(udata$user[1],length(idx)),item=items[idx],val=r[idx])topn<-topn[which(topn$val>0),]#推荐结果取前num个if(num>0){topn<-head(topn,num)}#返回结果return(topn)}#生成同现矩阵co<-cooccurrence(data)>co[,1][,2][,3][,4][,5][,6][,7][1,]5344221[2,]3332110
[3,]4343120[4,]4234221[5,]2112211[6,]2122120[7,]1001101#计算推荐结果recommendation<-data.frame()for(iin1:length(users)){udata<-data[which(data$user==users[i]),]recommendation<-rbind(recommendation,recommend(udata,co,0)):re_useritemval110433.5110618.0110515.511075.0210620.5210515.521074.0310324.5310218.5310616.5410237.0410526.041079.5510711.56.2.3R基于Hadoop分步式程序实现R语言实现的MapReduce算法,可以基于R的数据对象实现,不必如JAVA一样使用文本存储。算法思想同上面R语言实现思想,略有复杂。算法的思想:建立物品的同现矩阵按用户分组,得到所有物品出现的组合列表。对物品组合列表进行计数,建立物品的同现矩阵建立用户对物品的评分矩阵合并同现矩阵和评分矩阵
计算推荐结果列表按输入格式得到推荐评分列表通过MapReduce实现时,所有操作都要使用Map和Reduce的任务完成,程序实现过程略有变化。文字说明部分:建立物品的同现矩阵1)按用户分组,得到所有物品出现的组合列表。key:物品列表向量val:物品组合向量$key[1]101101101101101101101101101101101101101101101102102102102[20]102102102103103103103103103103103103103103104104104104104[39]104104104104104104104105105105105106106106106107107107107
[58]101101101101101101102102102102102102103103103103103103104[77]104104104104104105105105105105105106106106106106106$val[1]101102103101102103104101104105107101103104106101102103101[20]102103104101102103101102103104101103104106101102103104101[39]104105107101103104106101104105107101103104106101104105107[58]101102103104105106101102103104105106101102103104105106101[77]1021031041051061011021031041051061011021031041051062)对物品组合列表进行计数,建立物品的同现矩阵key:物品列表向量val:同现矩阵的数据框值(item,item,Freq)矩阵格式,要与”2.建立用户对物品的评分矩阵”的格式一致,把异构的两种数据源,合并为同一种数据格式,为”3.合并同现矩阵和评分矩阵”做数据基础。$key[1]101101101101101101101102102102102102102103103103103103103[20]104104104104104104104105105105105105105105106106106106106[39]106107107107107$valkvfreq11011015210110233101103441011044510110526101106271011071810210139102102310102103311102104212102105113102106114103101415103102316103103417103104318103105119103106220104101421104102210410331041044104105210410621041071105101210510211051031105104210510521051061331051071341061012351061021361061032371061042381061051391061062401071011411071041421071051431071071建立用户对物品的评分矩阵key:物品列表val:用户对物品打分矩阵矩阵格式,要与”2)对物品组合列表进行计数,建立物品的同现矩阵”的格式一致,把异构的两种数据源,合并为同一种数据格式,为”3.合并同现矩阵和评分矩阵”做数据基础$key[1]101101101101101102102102103103103103104104104104105105106[20]106107$valitemuserpref110115.0210122.0310132.0410145.0510154.0610213.0710222.5810253.0910312.510325.010343.010352.010422.010434.010444.510454.010534.510553.510644.010654.010735.0合并同现矩阵和评分矩阵这一步操作是MapReduce比较特殊的,因为数据源是两个异构数据源,进行MapReduce的操作。在之前,我们已经把两种格式合并为一样的。使用equijoin这个rmr2包的函数,进行矩阵合并。key:NULLval:合并的数据框$keyNULL$valk.lv.lfreq.litem.ruser.rpref.r1103101410312.52103102310312.53103103410312.54103104310312.55103105110312.56103106210312.57103101410325.08103102310325.09103103410325.010103104310325.011103105110325.012103106210325.013103101410343.0计算推荐结果列表把第三步中的矩阵,进行合并计算,得到推荐结果列表key:物品列表val:推荐结果数据框
$key[1]101101101101101101101101101101101101101101101101101101101101101101101101101102[19]101101101101101101101101101101[37]102102102102102102102102102102102102102102102102102103[55]103103103103103103103103103103103103103103103103103103[73]103103103103103104104104104104104104104104104104104104[91]104104104104104104104104104104104104104104104105105105[109]105105105105105105105105105105105106106106106106106106[127]106106106106106107107107107$valk.lv.luser.rv1101101125.02101101210.03101101310.04101101425.05101101520.06101102115.0710110226.0810110236.09101102415.0101102512.0101103120.010110328.010110338.0101103420.0101103516.0101104120.010110428.010110438.0....按输入格式得到推荐评分列表对推荐结果列表,进行排序处理,输出排序后的推荐结果。key:用户IDval:推荐结果数据框$key[1]11111112222222333333344444445555555$valuseritempref110144.0
110339.0110433.5110231.5110618.0110515.511075.0210145.5210341.5210436.0210232.5210620.5210515.521074.0310140.0310438.0310526.0310324.5310218.5310616.5310715.5410163.0410455.0410353.5410237.0410633.0410526.041079.5510168.0510459.0510356.5510242.5510634.5510532.0510711.5rmr2使用提示:rmr.options(backend='hadoop')这里backend有两个值,hadoop,local。hadoop是默认值,使用hadoop环境运行程序。local是一个本地测试的设置,已经不建议再使用。我在开发时,试过local设置,运行速度非常快,模拟了hadoop的运行环境。但是,local模式下的代码,不能和hadoop模式下完全兼容,变动也比较大,因此不建议大家使用。equijoin(...,outer=c('left'))这里outer包括了4个值,c("”,“left”,“right”,“full”),非常像数据库中两个表的join操作
keyval(k,v)mapReduce的操作,需要key和valve保存数据。如果直接输出,或者输出的未加key,会有一个警告Convertingto.dfsargumenttokeyvalwithaNULLkey。再上一篇文章中,rmr2的例子中就有类似的情况,请大家注意修改代码。to.dfs(1:10)Warningmessage:Into.dfs(1:10):Convertingto.dfsargumenttokeyvalwithaNULLkey代码部分:#加载rmr2包library(rmr2)#输入数据文件train<-read.csv(file="small.csv”,header=FALSE)names(train)<-c("user”,"item”,"pref")#使用rmr的hadoop格式,hadoop是默认设置。rmr.options(backend='hadoop')#把数据集存入HDFStrain.hdfs=to.dfs(keyval(train$user,train))from.dfs(train.hdfs)from.dfs(train.hdfs)13/04/0714:35:44INFOutil.NativeCodeLoader:Loadedthenative-hadooplibrary13/04/0714:35:44INFOzlib.ZlibFactory:Successfullyloaded&initializednative-zliblibrary13/04/0714:35:44INFOcompress.CodecPool:Gotbrand-newdecompressor$key[1]111222233334444555555$valuseritempref111015.0211023.0311032.5421012.0521022.5621035.0721042.0831012.0
931044.01031054.51131075.01241015.01341033.01441044.51541064.01651014.01751023.01851032.01951044.02051053.52151064.0#STEP1,建立物品的同现矩阵#1)按用户分组,得到所有物品出现的组合列表。train.mr<-mapreduce(train.hdfs,map=function(k,v){keyval(k,v$item)},reduce=function(k,v){m<-merge(v,v)keyval(m$x,m$y)})from.dfs(train.mr)$key[1]101101101101101101101101101101101101101101101102102102102[20]102102102103103103103103103103103103103103104104104104104[39]104104104104104104104105105105105106106106106107107107107[58]101101101101101101102102102102102102103103103103103103104[77]104104104104104105105105105105105106106106106106106$val[1]101102103101102103104101104105107101103104106101102103101[20]102103104101102103101102103104101103104106101102103104101[39]104105107101103104106101104105107101103104106101104105107[58]101102103104105106101102103104105106101102103104105106101[77]102103104105106101102103104105106101102103104105106#2)对物品组合列表进行计数,建立物品的同现矩阵
step2.mr<-mapreduce(train.mr,map=function(k,v){d<-data.frame(k,v)d2<-ddply(d,,(k,v),count)key<-d2$kval<-d2keyval(key,val)})from.dfs(step2.mr)$key[1]101101101101101101101102102102102102102103103103103103103[20]104104104104104104104105105105105105105105106106106106106[39]106107107107107$valkvfreq110110152101102331011034410110445101105261011062710110718102101391021023101021033111021042121021051131021061141031014151031023161031034171031043181031051191031062201041014211041022221041033231041044241041052
251041062261041071271051012281051021291051031301051042311051052321051061331051071341061012351061021361061032371061042381061051391061062401071011411071041421071051431071071#2.建立用户对物品的评分矩阵train2.mr<-mapreduce(train.hdfs,map=function(k,v){#df<-v[which(v$user==3),]df<-vkey<-df$itemval<-data.frame(item=df$item,user=df$user,pref=df$pref)}…y'val)…si,)$key[1]101101101101101102102102103103103103104104104104105105106[20]106107$valitemuserpref110115.0210122.0310132.0410145.0
510154.0610213.0710222.5810253.0910312.51010325.01110343.01210352.01310422.01410434.01510444.51610454.01710534.51810553.51910644.02010654.02110735.0#3.合并同现矩阵和评分矩阵eq.hdfs<-equijoin(left.input=step2.mr,right.input=train2.mr,map.left=function(k,v){广i"map.right=function(k,v){k'v)outer=c("left")from.dfs(eq.hdfs)$keyNULL$valk.lv.lfreq.litem.ruser.rpref.r1103101410312.52103102310312.53103103410312.54103104310312.55103105110312.56103106210312.57103101410325.0
8103102310325.09103103410325.010103104310325.011103105110325.012103106210325.013103101410343.014103102310343.015103103410343.016103104310343.017103105110343.018103106210343.019103101410352.020103102310352.021103103410352.022103104310352.023103105110352.024103106210352.025101101510115.026101102310115.027101103410115.028101104410115.029101105210115.030101106210115.031101107110115.032101101510122.033101102310122.034101103410122.035101104410122.036101105210122.037101106210122.038101107110122.039101101510132.040101102310132.041101103410132.042101104410132.043101105210132.044101106210132.045101107110132.046101101510145.047101102310145.048101103410145.049101104410145.050101105210145.051101106210145.052101107110145.053101101510154.054101102310154.055101103410154.056101104410154.057101105210154.058101106210154.059101107110154.060105101210534.561105102110534.562105103110534.563105104210534.564105105210534.565105106110534.566105107110534.567105101210553.568105102110553.569105103110553.570105104210553.571105105210553.572105106110553.573105107110553.574106101210644.075106102110644.076106103210644.077106104210644.078106105110644.079106106210644.080106101210654.081106102110654.082106103210654.083106104210654.084106105110654.085106106210654.086104101410422.087104102210422.088104103310422.089104104410422.090104105210422.091104106210422.092104107110422.093104101410434.094104102210434.095104103310434.096104104410434.097104105210434.098104106210434.099104107110434.0100104101410444.5101104102210444.5102104103310444.5103104104410444.5104104105210444.5105104106210444.5106104107110444.5107104101410454.0108104102210454.0109104103310454.0110104104410454.0111104105210454.0112104106210454.0113104107110454.0114102101310213.0115102102310213.0116102103310213.0117102104210213.0118102105110213.0119102106110213.0120102101310222.5121102102310222.5122102103310222.5123102104210222.5124102105110222.5125102106110222.5126102101310253.0127102102310253.0128102103310253.0129102104210253.0130102105110253.0131102106110253.0132107101110735.0133107104110735.0134107105110735.0135107107110735.0#4.计算推荐结果列表cal.mr<-mapreduce(input=eq.hdfs,
map=function(k,v){val<-vna<-is.na(v$user.r)if(length(which(na))>0)val<-v[-which(is.na(v$user.r)),]keyval(val$k.l,val)},reduce=function(k,v){val<-ddply(v,.(k.l,v.l,user.r),summarize,v=freq.l*pref.r)keyval(val$k.l,val)})from.dfs(cal.mr)$key[1]101101101101101101101101101101101101101101101101101101[19]101101101101101101101101101101101101101101101101101102[37]102102102102102102102102102102102102102102102102102103[55]103103103103103103103103103103103103103103103103103103[73]103103103103103104104104104104104104104104104104104104[91]104104104104104104104104104104104104104104104105105105[109]105105105105105105105105105105105106106106106106106106[127]106106106106106107107107107$valk.lv.luser.rv1101101125.02101101210.03101101310.04101101425.05101101520.06101102115.0710110226.0810110236.09101102415.010101102512.011101103120.01210110328.01310110338.014101103420.015101103516.016101104120.01710110428.01810110438.019101104420.0
20101104516.021101105110.02210110524.02310110534.024101105410.02510110558.026101106110.02710110624.02810110634.029101106410.03010110658.03110110715.03210110722.03310110732.03410110745.03510110754.03610210119.03710210127.53810210159.03910210219.04010210227.54110210259.04210210319.04310210327.54410210359.04510210416.04610210425.04710210456.04810210513.04910210522.55010210553.05110210613.05210210622.55310210653.054103101110.05510310
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论