大数据分析与应用微课版-课件 项目4 电商产品数据离线分析_第1页
大数据分析与应用微课版-课件 项目4 电商产品数据离线分析_第2页
大数据分析与应用微课版-课件 项目4 电商产品数据离线分析_第3页
大数据分析与应用微课版-课件 项目4 电商产品数据离线分析_第4页
大数据分析与应用微课版-课件 项目4 电商产品数据离线分析_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目四

电商产品数据离线分析2023年2月使用Hive创建电商产品数据库目录Content1使用Hve对商产品数据统计2使用Spark创建基于电商产品数据的分布式数据容器3使用SparkSQL完成电商产品数据分析4固定的周期进行数据分析离线数据分析技术项目导言零SparkSQLHive学习目标零知识目标了解Hive相关知识;熟悉Hive数据的操作;熟悉DataFrame创建;掌握SparkSQL的数据操作;具有实现海量数据离线分析的能力。技能目标具备使用HiveQL进行数据操作的能力;具备掌握Hive数据查询命令使用的能力;具备创建DataFrame的能力;具备应用SparkSQL分析数据的能力。素养目标具备团队意识;具有理论联系实际的素质和创新能力;具备处理人际关系的能力。任务4-1:使用Hive创建电商产品数据库壹Hive简介任务技能Hive是一个建立在Hadoop上用于处理结构化数据的数据仓库工具Hive表操作表主要由存储的数据和描述表格中数据形式的元数据组成,存放在分布式文件系统中,当表中未存在数据时,该表在HDFS中将以空文件夹存在Hive数据库操作通过HiveQL(HQL)语句完成对数据库和表的相关操作。目前,常用的数据库操作有数据库创建、数据库查看、数据库选择、数据库删除Hive数据操作与传统关系型数据库不同,Hive数据仓库提供了多种数据的增加操作,包括数据的导入、导出、插入任务4-1:使用Hive创建电商产品数据库壹1Hive简介Hive没有专门的数据存储格式,其所有数据均以text、SequenceFile、ParquetFile等格式存在于HDFS中,只需在创建表时通过列分隔符和行分隔符即可定义Hive表中的数据结构(1)Hive优缺点易上手;提供统一的元数据管理;存在多个接口,如Beeline、ODBC、JBCD、python、Thrift等;有较高的可扩展性,Hive可以做到随扩展集群规模且不需要重启服务;具有较强延展性,用户可根据自己的需求自定义函数;良好的容错性,可以保障即使有节点出现问题,SQL语句仍可完成执行;不支持事务,Hive不支持记录级别的增删改操作,但用可通过查询生成新表或按将结果保存到文件中;延迟较高,因为MapReducejob的启动耗时较长所以Hive的查询延时也很严重,不能应用在交互查询系统中。调优困难;可调控性差。任务4-1:使用Hive创建电商产品数据库壹Hive使用服务器—客户机(C/S)模式的架构,由MetaStore、Client、Driver和Hadoop组成,可通过交互接口接收SQL命令,使用Driver对指令进行翻译后生成MapReduce并提交到Hadoop执行(2)Hive体系架构任务4-1:使用Hive创建电商产品数据库壹2Hive数据库操作Hive作为一个数据仓库工具虽然与传统关系型数据库有本质区别,但却提供了与传统数据库类似的概念,可以通过HiveQL(HQL)语句完成对数据库和表的相关操作命令描述CREATEDATABASE创建数据库SHOWDATABASES查看数据库名称DESCRIBEDATABASE查看数据库信息USE选择数据库DROPDATABASE删除数据库任务4-1:使用Hive创建电商产品数据库壹(1)数据库创建在Hive中,数据库的创建通过“CREATEDATABASE”命令实现,在创建的同时会在HDFS中创建一个与数据库同名的目录,目录中包含的子目录则为该数据库中存在的表CREATEDATABASE[IFNOTEXISTS]<数据库名>[COMMENT]'数据库的描述信息'[LOCATION]'数据库在HDFS中的位置';参数描述IFNOTEXISTS创建数据库时,不管数据库是否存在都不抛出异常COMMENT定义数据库的描述信息LOCATION定义数据库在HDFS中的位置任务4-1:使用Hive创建电商产品数据库壹(2)数据库名称查看Hive提供了一个数据库名称查看命令“SHOWDATABASES”,在使用时不需要任何参数直接应用即可查看Hive中当前存在所有数据库,并将数据库的名称返回(3)数据库信息查看“DESCRIBEDATABASE”命令可以查看指定数据库的详细信息,在使用时只需提供数据库的名称即可DESCRIBEDATABASE<数据库名>;任务4-1:使用Hive创建电商产品数据库壹(4)数据库选择选择数据库使用“USE”命令,与“SHOWDATABASES”命令使用相同,只需指定数据库名称即可(5)数据库删除通过“DROPDATABASE”命令结合数据库名称即可完成数据库的删除,默认情况下,该命令只能删除不包含表的空数据库,可通过参数设置强制删除数据库USE<数据库名>;DROPDATABASE[IFEXISTS]<数据库名>[CASCADE];参数描述IFEXISTS删除数据库时,不管数据库表是否存在都不抛出异常CASCADE强制删除数据库任务4-1:使用Hive创建电商产品数据库壹3Hive表操作表主要由存储的数据和描述表格中数据形式的元数据组成,存放在分布式文件系统中,当表中未存在数据时,该表在HDFS中将以空文件夹存在。根据存在形式的不同,将表又分为内部表和外部表两种内部表数据文件存储在Hive数据仓库里,删除操作会删除相关目录及数据01外部表数据文件可以存储在Hive数据仓库外的分布式文件系统,在删除时,只会删除元数据信息,而不会删除HDFS中的数据02任务4-1:使用Hive创建电商产品数据库壹(1)Hive表操作与关系型数据库相同,Hive也包含表的创建、查询、删除、修改等常用操作命令描述CREATETABLE创建表SHOWTABLES查看表名称DESCRIBE查看表信息ALTERTABLE修改表DROPTABLE删除表任务4-1:使用Hive创建电商产品数据库壹(2)表创建表的创建通过“CREATETABLE”命令实现,在使用时可通过相关参数的指定数据字段的分隔符、表的元数据路径、设置分区等CREATE[EXTERNAL]TABLE<表名>(row1数据类型,row2数据类型,....)[COMMENT]'表描述信息'[PARTITIONEDBY]

(分区字段及类型)[ROWFORMATDELIMITED]{LINESTERMINATEDBY'\t'|FIELDSTERMINATEDBY

','|MAPKEYSTERMINATEDBY':'|COLLECTIONITEMSTERMINATEDBY

','}[STOREDAS]{TEXTFILE

|SEQUENCEFILE

|RCFILE

|ORC}[LOCATION]'表元数路径';任务4-1:使用Hive创建电商产品数据库壹(3)表名称查看在数据库表创建完成后,为了确认是否创建成功,这是可以通过“SHOWTABLES”命令实现数据库表名称的查看,并将当前数据库包含的所有数据库名称返回DESCRIBE[FORMATTED]<表名>;(4)表信息查看属性描述Database所属数据库CreateTime创建时间Location表在HDFS中的存储位置TableType表类型,其中:MANAGED_TABLE:内部表EXTERNAL_TABLE:外部表表信息查看命令为“DESCRIBE”,可以查看所属数据库、创建时间、数据集所在目录和表的类型(内部表/外部表)等信息任务4-1:使用Hive创建电商产品数据库壹(5)表修改ALTERTABLE”命令主要用于实现表的修改,包括表名修改、字段名修改,并且在修改时,只会改变表的信息而不会修改数据ALTERTABLE<旧表名>RENAMETO<新表名>;ALTERTABLE<表名>CHANGE<旧字段名><新字段名><字段类型>[COMMENT]'字段描述信息'[FIRST|AFTER]<字段名>;参数描述COMMENT定义字段的描述信息FIRST将调整修改后字段放到指定字段前AFTER将调整修改后字段放到指定字段后任务4-1:使用Hive创建电商产品数据库壹(6)表删除删除表的命令与删除数据库命令类似,删除表使用DROPTABLE命令,对于内部表会将数据一起删除,而对于外部表只会删除表结构DROPTABLE<表名>;任务4-1:使用Hive创建电商产品数据库壹与传统关系型数据库不同,Hive数据仓库提供了多种数据的增加操作,包括数据的导入、导出、插入等4Hive数据操作(1)数据导入数据导入是指将存储在Hadoop分布式文件系统中的数据导入到Hive表LOADDATA[LOCAL]INPATH'filepath'INTOTABLE<表名>[PARTITION](partcol1=val1,partcol2=val2...);参数描述LOCAL本地文件设置,不设置时表示从HDFS文件进行加载INPATH数据文件路径INTOTABLE指定目标表PARTITION设置分区列任务4-1:使用Hive创建电商产品数据库壹(2)数据导出在使用Hive进行统计分析后,为了避免数据的重复统计或丢失,可通过“INSERTOVERWRITE”命令将Hive表中的数据导出到本地或HDFS文件系统中永久保存,并将目标目录下的内容删除INSERTOVERWRITE[LOCAL]DIRECTORY'目标路径'SELECT...;参数描述LOCAL本地文件设置,不设置时表示导出到HDFSDIRECTORY目标路径SELECT数据查询语句任务4-1:使用Hive创建电商产品数据库壹(3)数据插入在Hive中,除了通过数据导入方式批量添加数据,还可以通过数据插入命令进行数据添加。目前,Hive有两种数据插入方式,分别是单条数据插入和查询结果插入INSERTINTO<表名>(字段列)VALUES(插入的值);1、单条数据插入是最简单的插入方式,可直接将指定的值追加到数据表中2、相比于单条数据插入,查询结果插入需要在单条数据插入的基础上结合SELECT语句实现INSERTINTO|OVERWRITETABLE<表名>[PARTITION](partcol1=val1,...)SELECT...;任务4-1:使用Hive创建电商产品数据库壹创建Hive数据库Step1绑定数据库Step2设置数据类型、字段分隔符以及数据在HDFS上的存储路径Step3检查创建好的表信息Step4Hive完成数据库和数据表的创建数据库、表、数据相关操作任务4-2:使用Hve对商产品数据统计贰算术运算任务技能在Hive的查询语句中,SELECT除了完成列的选择外,还具有强大的数据计算功能,可以通过算术运算符对选择的列进行数据计算数据查询在Hive数据操作中,除了数据的增加外,还存在数据查询操作,Hive的统计分析功能就是通过数据查询操作实现的任务4-2:使用Hve对商产品数据统计贰1算术运算在Hive的查询语句中,SELECT除了完成列的选择外,还具有强大的数据计算功能,可以通过算术运算符对选择的列进行数据计算运算符描述+和-差*乘积/商%取余&按位与,转换为二进制后进行计算,只有当相应位上的数都是1时,该位才取1,否则该为为0|按位或,转换为二进制后进行计算,只要相应位上存在1,那么该位就取1,均不为1,即为0。^按位异或,转换为二进制后进行计算,只有当相应位上的数字不相同时,该为才取1,若相同,即为0~A按位取反,转换成二进制后进行计算,0变1,1变0任务4-2:使用Hve对商产品数据统计贰2数据查询在Hive数据操作中,除了数据的增加外,还存在数据查询操作,Hive的统计分析功能就是通过数据查询操作实现的(1)基础查询语句SELECT命令用于检索表中的数据,FROM命令用于选择数据表SELECT<列名>FROM<表名>;需要注意的是,要查询的列名每个列之间使用逗号“,”作为分隔符,如果需要查询全部的字段可使用“*”符号代表查询全部字段任务4-2:使用Hve对商产品数据统计贰(2)表别名设置在进行多表的关联查询时,为了明确表和列的所属关系,通常会为表设置别名,只需在表名称后直接加入表的别名,并在SELECT语句后通过“别名.字段名”的方式进行字段的指定SELECT表别名.列1,表别名.列2...FROM<表名><表别名>;(3)列别名设置在使用查询语句时,得到的结果是由新列组成的新关系,也就是计算结果在原始表中不存在,这时可以通过“as”给新产生的列设置一个名称SELECT列1,列2,(列1+列2)as列别名FROM<表名>;任务4-2:使用Hve对商产品数据统计贰(3)查询结果限制Hive提供了一个LIMIT语句,可以通过指定个数限制结果数量SELECT列1,列2...FROM<表名>LIMITn;(4)条件查询语句为了过滤到更为详细的数据,可以通过WHERE语句设置过滤条件SELECT<列名>FROM<表名>WHERE查询条件;查询条件主要通过谓词操作符组成的表达式进行设置,当计算结果为true时相应的列值被保留并输出任务4-2:使用Hve对商产品数据统计贰(5)分组语句分组语句“GROUPBY”可以将一个或多个列包含数据做为key进行分组,并将重复key合并,而重复key对应的数据则可以通过聚合函数进行统计操作SELECT列1,sum(列2)FROM<表名>GROUPBY列1;sum()主要用于计算指定行的和,是Hive中较为常用的一种聚合函数。除了sum()之外,Hive还提过了多种用于其他计算的函数函数描述count(*)统计表中的总记录数sum(col)计算指定列数据的和sum(DISTINCTcol)计算去重后指定列数据的和avg(col)计算指定列数据的平均值avg(DISTINCTcol)计算去重后指定列数据的平均值min(col)计算指定列数据的最小值max(col)计算指定列数据的最大值var_samp(col)计算指定列数据的样本方差任务4-2:使用Hve对商产品数据统计贰(6)关联查询通过关联查询可以从多个表中进行数据的关联查询。关联查询常用的连接方式有内连接、左外连接、右外连接和满外(全外)连接等命令描述JOIN内连接LEFTJOIN左外连接RIGHTJOIN右外连接FULLOUTERJOIN满外(全外)连接任务4-2:使用Hve对商产品数据统计贰(7)内连接内连接可通过“JOIN”命令实现,主要用于交集数据的查询,返回在两个表中都存在的数据,并在连接的同时,可通过ON子句进行连接条件的定义SELECTa.col,b.colFROM<表名>aJOIN<表名>bONa.col=b.col;(8)左外连接以左表为主,将左表的所有数据与右表对应的数据进行连接,如果右表中没有与左表对应的数据时,会将数据值设置为“NULL”,可通过“LEFTJOIN”命令实现SELECTa.col,b.colFROM<表名>aLEFTJOIN<表名>bONa.col=b.col;任务4-2:使用Hve对商产品数据统计贰(9)右外连接与左外连接基本相同,右外连接以右表为主进行连接,会将左表中没有与右表对应的数据设置为“NULL”,可通过“RIGHTJOIN”命令实现SELECTa.col,b.colFROM<表名>aRIGHTJOIN<表名>bONa.col=b.col;(10)满外(全外)连接满外(全外)连接是指将两个表中的数据全部连接起来,如果没有对应的数则显示为空,可通过“FULLOUTERJOIN”命令实现SELECTa.col,b.colFROM<表名>aFULLOUTERJOIN<表名>bONa.col=b.col;任务4-2:使用Hve对商产品数据统计贰(11)排序查询在Hive中数据的排序查询有两种方法,分别是ORDERBY语句和SORTBY语句。其中,ORDERBY语句能够对所有数据进行全局排序,会将所有数据通过reducer进行处理SELECTcol1,col2FROM<表名>ORDERBYcol1;SORTBY语句在排序时,会启动多个reducer,单独对每个reducer中的数据进行排序,这样能够做到每个reducer输出的数据都是有序的,提高排序的效率SELECTcol1,col2FROM<表名>SORTBYcol1;任务4-2:使用Hve对商产品数据统计贰查询并统计数据Step1绑定数据库Step2在phone_comment表中,以level列做为key进行分组关联phone_comment表和phone_list表Step4某电商产品数据的处理与分析项目中数据的统计分析Hive数据查询操作Step3任务4-3:使用Spark创建基于电商产品数据的分布式数据容器叁任务技能SparkSQL简介Spark是由加州大学伯克利分校的AMP实验室基于内存开发的并行计算框架,主要用于实现大规模数据处理而设计DataFrame简介Spark为SparkSQL提供了DataFrame抽象,主要用于实现数据的存储,SparkSQL的数据统计分析就是基于这个抽象的API实现DataFrame创建在SparkSQL中,DataFrame通过数据源的加载实现创建任务4-3:使用Spark创建基于电商产品数据的分布式数据容器叁1SparkSQL简介Spark是由加州大学伯克利分校的AMP实验室基于内存开发的并行计算框架,主要用于实现大规模数据处理而设计,是熟悉RDBMS但又不理解MapReduce的技术人员的快速上手工具(1)SparkSQL简介SparkSQL是Spark中处理结构化数据的一个组件,其前身为Shark,即hiveonSpark,是当时唯一运行在Hadoop上的SQL-on-Hadoop工具任务4-3:使用Spark创建基于电商产品数据的分布式数据容器叁(2)SparkSQL优势相比于Shark,SparkSQL在数据分析性能方面的提升并不明显,但其表现出来的性能同样优异,这与其多方面优化有着密不可分的关系内存列存储存储空间占用小,读取的吞吐率大字节码生成技术减少了代码的冗余,实现了代码体积的压缩。统一数据访问SparkSQL提供了多种数据源的访问方法SQL使用可以使用多种语言的API进行数据的操作任务4-3:使用Spark创建基于电商产品数据的分布式数据容器叁(3)SparkSQL执行流程SparkSQL的语句在执行过程中会涉及Projection、DataSource、Filter等部分,与关系型数据库SQL查询过程的Result、DataSource、Operation一一对应任务4-3:使用Spark创建基于电商产品数据的分布式数据容器叁2DataFrame简介Spark为SparkSQL提供了DataFrame抽象,主要用于实现数据的存储,SparkSQL的数据统计分析就是基于这个抽象的API实现相比于RDD,DataFrame同样是分布式弹性数据集,能够根据内存情况自动进行缓存运算,与RDD最本质的区别在于数据的存储格式,RDD中所有数据为一个整体,每一行即为一个数据样本而DataFrame中数据按列存储,同样是一行表示为一个数据样本,每一行都包含多个列,每一列都表示一类数据,在RDD基础上将数据分组并增加头部字段名称和类型任务4-3:使用Spark创建基于电商产品数据的分布式数据容器叁3DataFrame创建DataFrame通过数据源的加载实现创建,例如RDD、结构化的数据文件(JSON、CSV等)、Hive数据库表、外部数据库(MySQL、Oracle等)等(1)基于RDD创建DataFrame在通过RDD实现DataFrame创建时,需要通过toDF()方法进行转换,其可以通过接收以“,”逗号分隔的多个参数实现列名称的设置RDD.toDF("第一列的列名称","第二列的列名称",...)任务4-3:使用Spark创建基于电商产品数据的分布式数据容器叁(2)加载结构化数据文件创建DataFrameSparkSQL支持的结构化数据文件有文本文件、JSON文件、CSV文件、parquet文件等,可以通过load()方法加载存储在本地或HDFS中的结构化数据文件并转换为DataFrameSparkSession.read.format("文件格式").load("HDFS或本地文件路径")(3)SparkSession对象SparkSession为SparkSQL的入口对象,主要用于数据的加载、转换、处理等工作方法描述appName()设置Spark应用程序的名字config()设置各种配置master()设置运行类型,参数值有:local:本地单线程运行local[n]:指定内核个数本地多线程运行local[*]:本地多线程getOrCreate()获取或者新建一个sparkSession任务4-3:使用Spark创建基于电商产品数据的分布式数据容器叁(4)format()方法format()方法主要用于文件类型的设置,通过参数的不同可以选择不同类型的加载文件参数值描述TEXT文本文件JSONjson文件CSVcsv文件Parquetparquet文件,默认文件格式任务4-3:使用Spark创建基于电商产品数据的分布式数据容器叁(5)load()方法load()方法主要用于数据文件的加载,只需指定数据文件所在地址即可,默认情况下加载HDFS上的数据文件,可在路径之前加入“file://”指定为本地数据文件//加载本地文件SparkSession.read.format("TEXT").load("file:///usr/local/data.txt")//加载HDFS文件SparkSession.read.format("TEXT").load("/usr/local/data.txt")任务4-3:使用Spark创建基于电商产品数据的分布式数据容器叁针对Hive中的数据,SparkSession对象提供了一个sql()方法,可以连接Hive并读取数据表中的数据创建DataFrame//连接Hive并使用数据库SparkSession.sql("use数据库名称")//查询数据库数据创建DataFrameSparkSession.sql("Hive数据库操作语句")在进行Hive数据库操作语句的编写时,可通过Spark提供的UDF自定义函数完成指定列数据的自定义功能(6)基于Hive数据表创建DataFrame任务4-3:使用Spark创建基于电商产品数据的分布式数据容器叁SparkSQL还可以通过JDBC或ODBC访问外部数据库创建DataFrame,其同样需要使用load()方法与format()方法//数据库连接变量名称="jdbc:mysql://1主机IP/数据库名称?useSSL=false"//访问数据库生成DataFrameSparkSession.read.format("jdbc").options(Map("url"->url,"user"->"root","password"->"123456","dbtable"->"test")).load()(7)基于外部数据库创建DataFrame任务4-3:使用Spark创建基于电商产品数据的分布式数据容器叁进入Spark安装目录的bin目录Step1通过pyspark进入Python版本的Spark命令行Step2从pyspark模块导入SparkSession并实例化SparkSessionStep3通过sql()方法结合Hive数据查询语句从productdata数据库的phone_list和phone_comment数据表获取全部数据创建DataFrameStep4根据产品详情数据创建分布式数据容器SparkSQL与DataFrame任务4-4:使用SparkSQL完成电商产品数据分析肆数据查看任务技能SparkSQL提供了多种数据查看方法,包含数据展示、数据统计信息查看等数据处理在SparkSQL中,除了数据的查看与过滤外,还提供了数据的处理操作,包括数据的修改、排序、分组统计、去重、删除等数据过滤SparkSQL也提供了多种数据过滤方法,可以从海量的数据中查找符合条件的数据

数据存储经过分析后的数据,为了满足后续的需要,还需将其保存。SparkSQL提供了一个save()方法,可以将DataFrame中的内容保存到本地文件、HDFS、Hive、MySQL以及本地中任务4-4:使用Spark创建基于电商产品数据的分布式数据容器肆1数据查看在完成DataFrame的创建后,可通过数据的查看进行验证。SparkSQL提供了多种数据查看方法,包含数据展示、数据统计信息查看等方法描述show(n)数据展示,无参数时,默认显示前20行数据first()展示第一行数据head(n)展示前n行数据,当参数为空时,表示展示第一行数据take(n)展示前n行数据,并以List形式显示collect()获取全部数据,并以List形式显示describe()查看字段的统计信息,并以DataFrame形式返回,当查看多个字段时通过逗号“,”连接任务4-4:使用Spark创建基于电商产品数据的分布式数据容器肆2数据过滤SparkSQL也提供了多种数据过滤方法,可以从海量的数据中查找符合条件的数据方法描述where()/filter()表达式过滤select()字段过滤where()和filter()方法可以通过设置条件表达式过滤数据,并以DataFrame对象形式返回所有符合条件的整条数据。当设置多个条件时,需要使用“or”和“and”名称描述or表示或,只需符合任意一个条件and表示并列,需要符合所有条件任务4-4:使用Spark创建基于电商产品数据的分布式数据容器肆3数据处理在SparkSQL中,除了数据的查看与过滤外,还提供了数据的处理操作,包括数据的修改、排序、分组统计、去重、删除等(1)orderBy()方法orderBy()方法在进行升序排列时,只需传入字段名称即可,但进行降序排列时,还需通过符号“-”或desc属性/方法实现DataFrame.orderBy("字段名称",ascending=0)任务4-4:使用Spark创建基于电商产品数据的分布式数据容器肆(2)groupBy()方法groupBy()方法在完成分组操作后都会伴随着统计操作,并将统计后的结果添加到分组后的返回结果中DataFrame.groupBy().方法名称()方法描述max()获取分组中元素的最大值min()获取分组中元素的最小值mean()获取分组中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论