




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章数据仓库Hive6.1.1数据仓库简介嵌入式系统基本概念数据仓库是一个面向主题的、集成的、随时间变化的、但信息本身相对稳定的数据集合,用于支持企业或组织的管理决策。数据源是数据仓库系统的基础,通常包括存放于关系数据库中的各种业务处理数据、各类文档数据、各类法律法规、市场信息和竞争对手的信息等等。数据仓库就是整合多个数据源的历史数据进行多角度、多维度的分析,并发现趋势,帮助高层管理者或者业务分析人员做出商业战略决策。6.1.2Hive简介嵌入式系统基本概念
Hive最初由Facebook开发,主要用于解决海量结构化日志数据的离线分析。Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供了类SQL查询语言HiveQL(HiveQueryLanguage)。当采用MapReduce作为执行引擎时,Hive能将HiveQL语句转变成MapReduce任务来执行,让不熟悉MapReduce的开发人员直接编写HiveQL语句来实现对大规模数据的统计分析操作,大大降低了学习门槛,同时也提升了开发效率。6.1.2Hive简介嵌入式系统基本概念
Hive作为Hadoop平台上的数据仓库工具,应用非常广泛,主要是因为它具有的特点十分适合数据仓库的统计分析。首先,HiveQL查询语句的语法结构与传统SQL语句的语法结构几乎一样,开发人员不需要学习新的编程知识,而是使用HiveQL语句就能处理海量数据,大大降低了编程难度。其次,数据仓库存储的是静态数据,对静态数据的分析一般采用批处理方式,不需要快速响应并得出结果,因而适合采用MapReduce进行批处理。再次,Hive本身提供了用来对数据进行提取、转化和加载的工具,可以存储、查询和分析存储在Hadoop中的海量数据。6.1.3Hive与关系型数据库的区别嵌入式系统基本概念表6-1Hive与关系型数据库的区别对比内容Hive关系型数据库查询语言HiveQLSQL数据存储位置HDFS本地文件系统数据更新不支持支持索引支持有限索引支持复杂索引分区支持支持执行引擎MapReduce、Spark、Tez自身的执行引擎执行延迟高低扩展性好有限数据规模大小6.1.4Hive系统架构嵌入式系统基本概念
1.元数据元数据(Metastore)需要存储在关系型数据库中,Hive默认使用Derby作为存储引擎,但一般推荐使用MySQL存储元数据。元数据主要包含表的模式信息,如表名、表所属的数据库、表的属性、表的列及其属性、表的分区及其属性、表中数据所在位置信息等。2.驱动驱动(Driver)包括编译器(Compiler)、优化器(Optimizer)和执行器(Executor)等,可以采用MapReduce、Spark或Tez作为执行引擎,当采用MapReduce作为执行引擎时,Hive能将HiveQL语句转换成一系列MapReduce作业。6.1.4Hive系统架构嵌入式系统基本概念
图6-1Hive系统架构6.1.4Hive系统架构嵌入式系统基本概念
3.用户接口用户接口包括CLI、Beeline、HWI、JDBC、ODBC、ThriftServer等,用来实现外部应用对Hive的访问。CLI(CommmandLineInterface)是Hive自带的命令行客户端工具,是非常常用的一种用户接口。Beeline是Hive新的命令行客户端工具,类似于CLI,功能更强大,支持嵌入模式和远程模式连接Hiveserver2服务来操作Hive。HWI(HiveWebInterface)是Hive的Web访问接口,提供了一种可以通过浏览器来访问Hive的服务。JDBC、ODBC以及ThriftServer可以向用户提供进行编程访问的接口。6.3Hive编程基础嵌入式系统基本概念
HiveQL是一门类SQL语言,它与大部分SQL语法兼容,但并不完全支持SQL标准,如HiveQL不支持事务,也不支持更新操作,它主要用于分析处理存储在HDFS中的结构化数据。6.3.1Hive的数据类型嵌入式系统基本概念
表6-2Hive常用的基本数据类型类型描述示例TINYINT1个字节有符号整数2SMALLINT2个字节有符号整数2INT4个字节有符号整数2BIGINT8个字节有符号整数2FLOAT4个字节单精度浮点数2.0DOUBLE8个字节双精度浮点数2.0BOOLEAN布尔类型,true/falsefalseSTRING字符串“hadoop”TIMESTAMP时间戳1234562236DATE日期‘2022-3-18’BINARY字节数组[0,1,2,3,0,1,2]6.3.1Hive的数据类型嵌入式系统基本概念
表6-3Hive的集合数据类型类型描述示例ARRAY数组,存储相同类型的数据,索引从0开始Array(1,2,3)MAP一组无序的键值对,键的类型必须是原子的,值可以是任何数据类型,同一个映射的键和值的类型必须相同Map(‘a’,2,
‘c’,1)STRUCT一组命名的字段,字段类型可以不同Struct(‘c’,2,0,1)6.3.2数据库相关操作嵌入式系统基本概念
1.创建数据库例如,创建数据库testdb,命令如下:hive>createdatabasetestdb;
如果testdb数据库已经存在,再创建testdb数据库就会抛出异常,加上ifnotexists关键字,可以避免抛出异常,命令如下:
hive>createdatabaseifnotexiststestdb;6.3.2数据库相关操作嵌入式系统基本概念
2.查看数据库描述信息例如,查看testdb的描述信息,命令如下:hive>describedatabasetestdb;3.将某个数据库设置为用户当前的工作数据库例如,将testdb设置为用户当前的工作数据库,命令如下:hive>usetestdb;6.3.2数据库相关操作嵌入式系统基本概念
4.显示所有的数据库hive>showdatabases;5.删除数据库例如,删除testdb,命令如下:hive>dropdatabasetestdb;当数据库中存在表时,需要加cascade才能删除,命令如下:hive>dropdatabasetestdbcascade;6.3.2数据库相关操作嵌入式系统基本概念图6-15数据库相关操作6.3.3表相关操作嵌入式系统基本概念
1.创建表创建表的通用语句如下:CREATE[EXTERNAL]TABLE[IFNOTEXISTS]table_name
[(col_name
data_type[COMMENTcol_comment],...)]
[COMMENTtable_comment]
[PARTITIONEDBY(col_name
data_type[COMMENTcol_comment],...)]
[CLUSTEREDBY(col_name,col_name,...)
[SORTEDBY(col_name[ASC|DESC],...)]INTOnum_bucketsBUCKETS]
[ROWFORMATrow_format]
[STOREDASfile_format]
[LOCATIONhdfs_path]6.3.3表相关操作嵌入式系统基本概念可使用CREATETABLEtable_name命令创建一个指定表名的表。如果相同名字的表已经存在,则会抛出异常,加上IFNOTEXISTS关键字,可以避免抛出异常。下面介绍常用的可选项:Hive中有两种表:内部表和外部表。Hive默认创建的表都是内部表,每一个表在该数据仓库目录下都拥有一个对应的目录,用于存储数据。当删除一个内部表时,Hive会同时删除元数据和这个数据目录。内部表不适合和其它工具共享数据。6.3.3表相关操作嵌入式系统基本概念
EXTERNAL关键字可以让编程人员创建一个外部表,在创建表的同时指定数据读取的路径(LOCATION),外部表仅记录数据所在的路径,不对数据的位置做任何改变。当删除表时,外部表只删除元数据,数据文件不会删除。
Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。分区的好处是可以让数据按照区域进行分类,查询时避免全表扫描。我们可以使用PARTITIONEDBY语句创建有分区的表,表和分区都可以对某个列进行CLUSTEREDBY操作。6.3.3表相关操作嵌入式系统基本概念
1,Tom,85.0,A2,Barry,81.0,C3,Rich,87.0,B4,George,83.0,B5,Jones,86.0,A6,Mark,97.0,C7,Ulf,96.0,C8,Jery,89.0,A9,Alice,91.0,B10,David,80.0,C6.3.3表相关操作嵌入式系统基本概念
(1)创建内部表例如,根据上述数据创建内部表students,命令及执行结果如图6-16所示。由于students.txt以‘,’分割字段,所以在HiveQL中使用如下命令进行特别指定:rowformatdelimitedfieldsterminatedby','图6-16创建内部表students6.3.3表相关操作嵌入式系统基本概念
(2)创建外部表例如,根据上述数据创建外部表students2,命令及执行结果如图6-17所示。图6-17创建外部表students26.3.3表相关操作嵌入式系统基本概念
2.查看表例如,查看当前数据库中的表,命令如下:
hive>showtables;3.查看表的结构信息例如,查看students表的结构信息,命令如下:hive>describestudents;6.3.3表相关操作嵌入式系统基本概念
图6-18查看表及表结构信息6.3.3表相关操作嵌入式系统基本概念
4.删除表例如,删除students表,命令如下:
hive>droptablestudents;6.3.4表中数据的加载嵌入式系统基本概念往表中加载数据,就是采用某种方法,将数据文件按表的规则放置在表所属的目录下。加载数据的语法规则如下:LOADDATA[LOCAL]INPATH'filepath'[OVERWRITE]INTOTABLEtablename[PARTITION(partcol1=val1,partcol2=val2...)]6.3.4表中数据的加载嵌入式系统基本概念各参数的含义如下:
filepath:表示被加载数据文件的路径。LOCAL:为可选关键字,命令中有该关键字时,INPATH后的路径代表的是本地文件系统上的路径,没有该关键字时,INPATH后的路径代表的是HDFS上的路径。OVERWRITE:为可选关键字,命令中有该关键字时,表tablename中的数据将被删除,然后再把filepath中的文件导入到表tablename下。6.3.4表中数据的加载嵌入式系统基本概念
1.从本地加载数据到Hive表例如,加载本地文件students.txt中的数据到students表,命令及执行结果如图6-19所示。其中,“local”表示INPATH后的路径代表的是本地文件系统上的路径;“overwrite”表示加载的数据将覆盖原有数据。图6-19加载本地数据到Hive表6.3.4表中数据的加载嵌入式系统基本概念2.从HDFS中加载数据到Hive表例如,从HDFS上加载students.txt中的数据到students2表,假设students.txt已上传到HDFS的/test2目录下,命令及执行结果如图6-20所示。图6-20从HDFS中加载数据到Hive表6.3.5HiveQL基本查询嵌入式系统基本概念
Hive查询基本语法规则如下:
SELECT[ALL|DISTINCT]select_expr,select_expr,...FROMtable_reference[WHEREwhere_condition][GROUPBYcol_list][ORDERBYcol_list][CLUSTERBYcol_list|[DISTRIBUTEBYcol_list][SORTBYcol_list]][LIMITnumber]6.3.5HiveQL基本查询嵌入式系统基本概念各参数的含义如下:ALL|DISTINCT:ALL指全部,是默认形式;DISTINCT会去掉查询结果中的重复数据。FROM:指定所查询的表,如果有多个表需要同时查询,各表之间用“,”号分隔。WHERE:指定查询表内容的过滤条件。GROUPBY:指定按照哪些字段进行分组。
ORDERBY:对查询结果进行全局排序。6.3.5HiveQL基本查询嵌入式系统基本概念DISTRIBUTEBY:控制map结果的分发,它会将具有相同Key的map输出分发到同一个reduce节点上做处理。
SORTBY:对数据进行局部排序。CLUSTERBY:当DISTRIBUTEBY和SORTBY所指定的字段相同时,且都是升序,CLUSTERBY就相当于前两个语句。LIMIT:指定查询记录的条数。6.3.5HiveQL基本查询嵌入式系统基本概念
1.基本查询例如,查询students表中的所有记录,命令及执行结果如图6-21所示。图6-21基本查询示例6.3.5HiveQL基本查询嵌入式系统基本概念
2.where语句select语句用于选择字段,where语句用于筛选条件,两者结合使用,可查找出符合要求的信息。例如,查找students表中分数90分以上的学生姓名和分数,命令及执行结果如图6-22所示。图6-22where语句示例6.3.5HiveQL基本查询嵌入式系统基本概念3.like和rlike语句like和rlike可以让用户通过字符串匹配来进行模糊查询,%代表任意多个字符,其中rlike子句可以通过Java的正则表达式来指定匹配条件。例如,(1)查询姓名以字母‘J’开头的学生信息;(2)查询姓名中包含字母‘o’的学生信息;命令及执行结果如图6-23所示。6.3.5HiveQL基本查询嵌入式系统基本概念
图6-23like和rlike语句示例6.3.5HiveQL基本查询嵌入式系统基本概念
4.groupby语句groupby语句通常会和聚合函数一起使用,根据一个或多个列对结果集进行分组。然后对每个组执行聚合操作。例如,查询每个班的平均成绩,命令及执行结果如图6-24所示。6.3.5HiveQL基本查询嵌入式系统基本概念
图6-24groupby语句示例6.3.5HiveQL基本查询嵌入式系统基本概念
5.having语句having语句一般与groupby、聚合函数一起使用,用于对分组统计的结果进行过滤。例如,查询平均成绩大于或等于87的班级,命令及执行结果如图6-25所示。6.3.5HiveQL基本查询嵌入式系统基本概念
图6-25having语句示例6.3.5HiveQL基本查询嵌入式系统基本概念6.orderby语句orderby语句用于根据指定的字段对结果集进行排序,默认是按asc升序排序,也可用desc指示降序排序。例如,查询学生的姓名和成绩,并按成绩降序排列,命令及执行结果如图6-26所示。6.3.5HiveQL基本查询嵌入式系统基本概念图6-26orderby语句示例6.3.5HiveQL基本查询嵌入式系统基本概念7.limit语句可以使用limit限制返回记录的最大条数。例如,查询成绩前3名的学生信息,命令及执行结果如图6-27所示。6.3.5HiveQL基本查询嵌入式系统基本概念
图6-27limit语句示例6.3.5Hive函数嵌入式系统基本概念
Hive提供了大量的运算符和内置函数供用户使用,为常规业务的计算提供了很大的便利。这些运算符和函数包括:数值运算符、关系运算符、逻辑运算符、统计函数、字符串函数、条件函数、日期函数、聚集函数和处理XML和JSON的函数等。6.3.5Hive函数嵌入式系统基本概念
Hive提供了对函数的帮助提示信息命令。例如,查看函数列表命令如下:hive>showfunctions;查看sum函数的帮助信息,命令及执行结果如图6-28所示。图6-28查看sum函数的帮助信息6.3.5Hive函数嵌入式系统基本概念
1.统计函数对数值型字段,可以用max()函数求最大值,用min()函数求最小值,用sum()函数求和,用avg()函数求平均值;还可以用count()函数统计记录的条数。使用上述函数,都会触发MapReduce操作。例如,统计students表中记录的条数、最高分、最低分、平均分和总分,命令及执行结果如图6-29所示。6.3.5Hive函数嵌入式系统基本概念
图6-29统计函数示例6.3.5Hive函数嵌入式系统基本概念
2.distinct()函数
distinct()函数用于去除重复值。例如,查询students表中存储了多少个班级的学生,命令及执行结果如图6-29所示。6.3.5Hive函数图6-30distinct()函数示例6.4.1雇员表统计嵌入式系统基本概念
【例6-1】假设在本地文件系统/user/data目录下,有个名为employees.txt的文本文件,文件内容如下:1,Rich,5835.0,12,Barry,7236.0,33,Ani,6125.0,54,George,8313.0,25,Ulf,7412.0,36,Tom,8313.0,67,Jiao,5646.0,28,Hni,6318.0,6其中,第1列为员工编号、第2列为姓名、第3列为月薪、第4列为部门编号,根据上述数据,通过Hive编程完成以下操作:6.4.1雇员表统计嵌入式系统基本概念
1.创建数据库emp。hive>createdatabaseemp;hive>useemp;2.创建employees表。hive>createtableemployees(idint,namestring,salarydouble,deptsstring)rowformatdelimitedfieldsterminatedby',';6.4.1雇员表统计嵌入式系统基本概念
3.导入数据employees.txt到employees表。hive>loaddatalocalinpath'/user/data/employees.txt'overwriteintotableemployees;4.查询employees表中所有雇员的员工编号、姓名、年薪。hive>selectid,name,salary*12fromemployees;5.查看employees表中工资在5000至7000之间的记录。hive>select*fromemployeeswheresalary>=5000andsalary<7000;6.查询employees表部门编号不为3的员工编号、姓名、部门编号,并按员工编号降序排列hive>selectid,name,deptsfromemployeeswheredepts<>3orderbyiddesc;6.4.1雇员表统计嵌入式系统基本概念
7、将所有员工先按部门编号升序,当部门一样时,再按姓名降序排列hive>select*fromemployeesorderbydeptsasc,namedesc;8.查询employees表每个部门的编号、平均工资hive>selectdepts,avg(salary)fromemployeesgroupbydepts;9.统计employees表中有多少个不重复部门hive>selectcount(distinctdepts)fromemployees;10.查询employees表薪水大于6000的员工姓名及所在部门编号hive>selectname,deptsfromemployeeswheresalary>6000;6.4.1雇员表统计嵌入式系统基本概念
11.在employees表中,工资最高的员工姓名、薪水hive>selectname,salaryfromemployeesa,(selectmax(salary)max_salfromemployees)bwherea.salary=b.max_sal;12.在employees表中,工资高于平均工资员工姓名、薪水hive>selectname,salaryfromemployeesa,(selectavg(salary)avg_salfromemployees)bwherea.salary>b.avg_sal;13.查询employees表平均年薪小于75000的部门编号、平均年薪hive>selectdepts,12*avg(salary)fromemployeesgroupbydeptshavingavg(salary)*12<75000;6.4.2词频统计嵌入式系统基本概念
【例6-2】假设在HDFS的/test2目录下,有多个文本文件,每个文件存储多个英文单词,单词之间用空格分隔。请Hive统计每个单词出现的次数。6.4.2词频统计嵌入式系统基本概念
hive>createtablewordline(linestring);hive>loaddatainpath'/test2'overwriteintotablewordline;hive>createtablewordcountasselectword,count(1)ascountfrom(selectexplode(split(line,''))aswordfromwordline)wgroupbywordorderbyword;6.4.2词频统计嵌入式系统基本概念执行完成后,可用select语句查看运行结果,如图6-31所示。由于本例与第4章的WordCount统计同样的文件,所以程序运行的结果一样。图6-31用select语句查看运行结果1.4.3YARN嵌入式系统基本概念
YARN(YetAnotherResourceNegotiator,另一种资源协调者)是一种新的Hadoop资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在资源利用率、资源统一管理和数据共享等方面带来了很大好处。YARN采用主从架构(Master/Slave),包括:ResourceManager、ApplicationMaster和NodeManager三个核心组件。1.5Hadoop生态系统嵌入式系统基本概念
图1-1hadoop的生态系统1.5.1HBase嵌入式系统基本概念HBase(HadoopDatabase,hadoop数据库)是一个针对非结构化数据的可伸缩、高可靠、高性能、分布式和面向列的开源数据库,一般采用HDFS作为底层数据存储系统。HBase是针对GoogleBigtable的开源实现,二者采用相同数据模型,具有强大的非结构化数据存储能力。HBase使用ZooKeeper进行管理,它保障查询速度的一个关键因素就是RowKey的设计是否合理。HBase中保存的数据可以使用MapReduce来处理。1.5.2Hive嵌入式系统基本概念
Hive是一个基于Hadoop的数据仓库工具,最早由Facebook开发并使用。Hive可以将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,这套SQL称为HiveQL(HiveQueryLanguage)。当采用MapReduce作为执行引擎时,Hive能将HiveQL语句转换成一系列MapReduce作业,并提交到Hadoop集群上运行。Hive大大降低了学习门槛,同时也提升了开发效率,非常适合数据仓库的统计分析。1.5.3Pig嵌入式系统基本概念
Pig是一种数据流语言和运行环境,用于检索大规模的数据集。Pig定义了一种数据流语言—PigLatin,将脚本转换为MapReduce任务在Hadoop上执行,适合于使用Hadoop平台来查询大型半结构化数据集。1.5.4Spark嵌入式系统基本概念
Spark(内存计算框架)是专为大规模数据处理而设计的快速通用的计算引擎。Spark最初由美国加州伯克利大学的AMP实验室于2009年开发,是基于内存计算的大数据并行计算框架,可用于构建大型的、低延迟的数据分析应用程序。Spark不同于MapReduce,它的Job中间输出结果可以保存在内存中,从而大大提高迭代运算效率,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代算法。1.5.5ZooKeeper嵌入式系统基本概念
ZooKeeper(分布式协作服务)是一个开源的分布式应用程序协作框架,是GoogleChubby的开源的实现,能为大型分布式系统提供了高效且可靠的分布式协调服务,提供的功能包括:配置维护、统一命名、分布式同步、集群管理等。ZooKeeper可用于Hadoop、HBase、Kafka等大型分布式开源系统,例如HBase高可用、HDFSNameNodeHA自动切换等都是通过ZooKeeper来实现的。1.5.6Sqoop嵌入式系统基本概念
Sqoop(数据库ETL工具)是SQLtoHadoop的缩写,主要用于关系数据库和Hadoop之间传输数据。通过Sqoop可以将数据从关系型数据库(MySQL、Oracle等)导入到到Hadoop生态系统(HDFS、HBase、Hive等),也可以将数据从Hadoop生态系统导出到关系型数据库。导入导出过程由MapReduce计算框架实现,非常高效。1.5.7Flume嵌入式系统基本概念
Flume(日志收集工具)是由Cloudera提供的一个高可用、高可靠、分布式的海量日志采集、聚合和传输的系统。Flume支持在日志系统中定制各类数据发送方,从而支持收集各种不同协议数据。同时,Flume提供对数据进行简单处理的能力,如过滤、格式转换等。1.5.8Mahout嵌入式系统基本概念
Mahout是Apache软件基金会旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout包含许多实现,包括聚类、分类、推荐过滤、频繁子项挖掘。此外,通过使用ApacheHadoop库,Mahout可以有效地扩展到云中。1.5.9Ambari嵌入式系统基本概念
ApacheAmbari是一个基于Web的工具,支持ApacheHadoop集群的安装、部署、配置和管理,Ambari目前已支持大多数Hadoop组件,包括HDFS、MapReduce、Hive、Pig、HBase、ZooKeeper、Sqoop等。第7章内存计算框架Spark7.1.1Spark简介嵌入式系统基本概念
Spark最初由UCBerkeleyAMPlab(加州大学伯克利分校的AMP实验室)于2009年开发,可用于构建大型的、低延迟的数据分析应用程序,是基于内存计算的大数据并行计算框架。7.1.1Spark简介嵌入式系统基本概念
Spark具有如下几个主要特点:1.运行速度快与MapReduce相比,Spark可以支持包括Map和Reduce在内的更多操作,这些操作相互连接形成一个有向无环图(DirectedAcyclicGraph,DAG),各个操作的中间结果被保存在内存中,因此,Spark的处理速度比MapReduce快得多。2.容易使用Spark可以使用Scala、Java、Python、R和SOL进行编程,还可以通过SparkShell进行交互式编程。7.1.1Spark简介嵌入式系统基本概念
3.通用性Spark提供了完整而强大的技术栈,包括SQL查询、流式计算、机器学习和图算法等组件,开发者可以在同一个应用程序中无缝组合地使用这些组件。4.运行模式多样Spark支持多种运行模式:本地运行模式、分布式运行模式。Spark集群的底层资源可以借助于外部的框架进行管理,比如,Spark可以使用Hadoop的YARN和AppacheMesos作为它的资源管理和调度器,并且可以访问HDFS、Cassandra、HBase、Hive等多种数据源。7.1.2Spark生态系统Spark的设计遵循“一个软件栈满足不同应用场景”的理念,逐渐形成了一套完整的生态系统,Spark生态系统如图7-1所示。
Spark的设计遵循“一个软件栈满足不同应用场景”的理念,逐渐形成了一套完整的生态系统,Spark生态系统如图7-1所示。图7-1Spark生态系统7.1.3Spark运行架构嵌入式系统基本概念
图7-2Spark运行架构7.2Scala基础嵌入式系统基本概念由于Spark是由Scala语言编写的,Scala语言是Spark编程的首选语言,为了后续更好地学习Spark,需要首先学习Scala语言。7.2.1Scala简介嵌入式系统基本概念
Scala是一种将面向对象和函数式编程结合在一起的高级语言,旨在以简洁、优雅和类型安全的方式表达通用编程模式。Spark支持使用Scala、Java、Python和R语言进行编程。Spark编程首选语言是Scala,因为Spark这个软件本身就是使用Scala语言开发的,Scala具有强大的并发性,支持函数式编程,可以更好地支持分布式系统,并且支持高效的交互式编程。采用Scala语言编写Spark应用程序,可以获得很好的性能。7.2.1Scala简介嵌入式系统基本概念
Scala是一种基于JVM的跨平台编程语言,Scala编译器可以将Scala源码编译成符合JVM虚拟机规范的中间字节码文件,在JVM平台上解释和运行;Scala语言的API可无缝兼容Java的API。7.2.2Scala编程嵌入式系统基本概念
Scala中使用关键字val和var声明变量。val类似Java中的final变量,也就是常量,一旦初始化将不能修改;var类似Java中的非final变量,可以被多次赋值,多次修改。Scala语言使用灵活,支持自动类型推测,非常简洁高效。如定义一个初值为5的整型常量,下面两种写法是等效的:
vala=5
vala:Int=57.2.2Scala编程嵌入式系统基本概念【例7-1】从控制台读入数据:使用readInt、readDouble、readLine输入整数、实数、字符串,使用print、println输出已读入的数据。
scala>importio.StdIn._
scala>varx=readInt()
scala>vary=readDouble()
scala>varstr=readLine("pleaseinputyourname:")
scala>print(x)
scala>println(y)
scala>println(str)7.2.2Scala编程嵌入式系统基本概念
【例7-2】创建一个列表list1,包含10个元素,这10个元素是乱序的,然后这些元素进行以下操作并生成新的列表,list1保持不变:遍历,排序,反转,求和(多种方法,包括用循环结构),对所有元素乘2,对所有元素加1,过滤出只包含偶数的列表,拆分成大小为3的子列表。7.2.2Scala编程嵌入式系统基本概念
//创建一个列表list1
scala>vallist1=List(3,9,2,5,7,6,1,8,0,4)//遍历
scala>list1.foreach(println)//排序
scala>vallist2=list1.sorted//反转
scala>vallist3=list1.reverse7.2.2Scala编程嵌入式系统基本概念
//求和
vallist4=list1.sum//求和
scala>vallist5=list1.reduce(_+_)//用循环结构求和
scala>varh=0for(i<-0tolist1.length-1)h=h+list1(i)
scala>println("h="+h)7.2.2Scala编程嵌入式系统基本概念//每个元素乘以2scala>vallist5=list1.map(_*2)//每个元素加1scala>vallist6=list1.map(_+1)//过滤出只包含偶数的列表scala>vallist7=list1.filter(x=>x%2==0)7.2.2Scala编程嵌入式系统基本概念
//拆分成大小为3的子列表
scala>val
ged=list1.grouped(3)
scala>ged.next
scala>ged.next
scala>ged.next
scala>ged.next7.4RDD编程基础嵌入式系统基本概念
RDD(ResilientDistributedDataset),弹性分布式数据集,是分布式内存的一个抽象概念,RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合。RDD是Spark的核心概念。7.4.1SparkShell的启动和退出嵌入式系统基本概念
图7-17SparkShell成功启动后的界面7.4.2RDD创建嵌入式系统基本概念
1.从对象集合创建RDDSpark可以调用SparkContext的parallelize(),以一个已经存在的集合(列表)为数据源,创建RDD。例如,通过一个List列表创建RDD,命令如图7-18所示。图7-18parallelize创建RDD7.4.2RDD创建嵌入式系统基本概念
2.从外部存储创建RDDSpark的textFile()方法可以从文件系统中加载数据创建RDD,下面演示从HDFS和Linux本地加载数据创建RDD。(1)从HDFS中加载数据例如,在HDFS上有一个文件“/test2/f1.txt”,读取该文件创建一个RDD,命令如图7-19所示。图7-19从HDFS中加载数据7.4.2RDD创建嵌入式系统基本概念
(2)从Linux本地加载数据例如,在Linux本地有一个文件“/user/data/f2.txt”,读取该文件创建一个RDD,命令如图7-20所示。图7-20从Linux本地加载数据7.4.3常用的RDD操作嵌入式系统基本概念RDD的操作分为行动操作(Action)和转换操作(Transformation)。1.行动操作Spark程序执行到行动操作时,才会从文件中加载数据,完成一次又一次转换操作,最后完成行动操作。由于转换操作需要行动操作才能查看命令执行的结果,所以先介绍行动操作。7.4.3常用的RDD操作嵌入式系统基本概念
(1)count()返回RDD中的元素个数(2)collect()以数组的形式返回数据集中的所有元素(3)first()返回数据集中的第一个元素(4)take(n)返回一个数组,数组元素由数据集的前n个元素组成(5)reduce(func)通过函数func聚合数据集中的元素(6)foreach(func)对RDD中的每一个元素运行给定的函数func7.4.3常用的RDD操作嵌入式系统基本概念例如,统计rdd1中的元素个数,以数组的形式返回rdd1的所有元素,取rdd1的第一个元素,取rdd1的前3个元素,求rdd1中所有元素之和,输出rdd1的所有元素,代码及执行结果如图7-21所示。RDD的操作如果没有参数,后面的括号是可以省略的。7.4.3常用的RDD操作嵌入式系统基本概念
图7-21RDD的行动操作7.4.3常用的RDD操作嵌入式系统基本概念2.转换操作对于RDD而言,每一次转换操作都会产生新的RDD,供给下一个“转换”使用。转换操作是惰性操作,整个转换过程只是记录了转换的轨迹,并不会发生真正的计算,只有遇到行动操作时,才会触发“从头到尾”的真正的计算。7.4.3常用的RDD操作嵌入式系统基本概念
(1)filter(func)例如,过滤出rdd1中大于3的元素,并输出结果,可用两种方法实现,代码及执行结果如图7-22所示。7.4.3常用的RDD操作嵌入式系统基本概念图7-22过滤出rdd1中大于3的元素7.4.3常用的RDD操作嵌入式系统基本概念
(2)map(func)例如,将rdd1中每一个元素加5,并输出结果,代码及执行结果如图7-23所示。图7-23将rdd1中每一个元素加57.4.3常用的RDD操作嵌入式系统基本概念
(3)flatMap(func)
flatMap(func)操作是将RDD中的每一个元素传递到函数func中,将返回的迭代器(数组、列表)中的所有元素构成新的RDD。例如,用map(func)和flatMap(func)分割字符串,代码及执行结果如图7-24所示。7.4.3常用的RDD操作嵌入式系统基本概念
图7-24用map(func)和flatMap(func)分割字符串7.4.3常用的RDD操作嵌入式系统基本概念(4)groupByKey()groupByKey()应用于(key,value)键值对的RDD,可以将相同key的元素聚集到一起,返回一个新的(key,Iterable)形式的RDD。例如,有两位员工zhangsan和lisi,zhangsan的工资和奖金分别为5000元、1500元,lisi的工资和奖金分别为6000元、2000元,统计zhangsan和lisi的总收入,代码及执行结果如图7-25所示。7.4.3常用的RDD操作嵌入式系统基本概念
图7-25groupByKey()示例7.4.3常用的RDD操作嵌入式系统基本概念(5)reduceByKey(func)
reduceByKey(func)应用于(key,value)键值对的RDD时,返回一个新的(key,value)形式的RDD,其中的每个值是将每个key传递到函数func中进行聚合后得到的结果。用reduceByKey(func)重做上例,代码及执行结果如图7-26所示。7.4.3常用的RDD操作嵌入式系统基本概念图7-26reduceByKey(func)示例7.4.3常用的RDD操作嵌入式系统基本概念
(6)sortBy()
sortBy()将RDD中的元素按照某一字段进行排序,其中第一个参数为排序字段,第二个参数是一个布尔值,指定升序(默认)或降序。若第二个参数是false则为降序排列。例如,列表中存放了一些(key,value)键值对,用该列表创建RDD,然后对该RDD中的元素按照第二个字段降序排列,代码及执行结果如图7-27所示。7.4.3常用的RDD操作嵌入式系统基本概念图7-27sortBy()示例7.4.3常用的RDD操作嵌入式系统基本概念
(7)union()union()的参数是RDD,它将两个RDD合并为一个新的RDD,两个RDD中的数据类型要保持一致。例如,创建两个RDD,并将这两个RDD合并成一个新的RDD,代码及执行结果如图7-28所示。7.4.3常用的RDD操作嵌入式系统基本概念
图7-28union()示例7.4.3常用的RDD操作嵌入式系统基本概念
(8)mapValues(func)
mapValues(func)对键值对RDD中的每个value都应用函数func,但是key不会发生变化。例如,将键值对RDD中的每个value加2,代码及执行结果如图7-29所示。7.4.3常用的RDD操作嵌入式系统基本概念
图7-29mapValues(func)示例7.4.3常用的RDD操作嵌入式系统基本概念
(9)keys键值对RDD中的每个元素都是(key,value)形式,keys操作只会把键值对RDD中的key返回,形成一个新的RDD。(10)values键值对RDD中的每个元素都是(key,value)形式,values操作只会把键值对RDD中的value返回,形成一个新的RDD。例如,分别输出键值对RDD中的每个元素的键和值,代码及执行结果如图7-30所示。7.4.3常用的RDD操作嵌入式系统基本概念
图7-30keys和values示例7.4.4RDD编程实例嵌入式系统基本概念
【例7-3】假设在HDFS的/test2目录下,有多个文本文件,每个文件存储多个英文单词,单词之间用空格分隔。请统计每个单词出现的次数。7.4.4RDD编程实例嵌入式系统基本概念
scala>vallines=sc.textFile("/test2")
scala>val
rddfalt=lines.flatMap(x=>x.split(""))
scala>val
wordCount=rddfalt.map(x=>(x,1)).reduceByKey((a,b)=>a+b)
scala>wordCount.collect()
scala>wordCount.foreach(println)7.4.4RDD编程实例嵌入式系统基本概念
【例7-4】hadoop.txt和spark.txt分别存储了同一个班的《Hadoop基础》和《Spark编程基础》成绩,其中第1列表示学号,第2列表示成绩。请在SparkShell中通过编程来完成以下操作:7.4.4RDD编程实例嵌入式系统基本概念
1.从本地文件系统中加载hadoop.txt
scala>valhadoop1=sc.textFile("file:///home/shxx/data/hadoop.txt")2.从本地文件系统中加载spark.txt
scala>valspark1=sc.textFile("file:///home/shxx/data/spark.txt")7.4.4RDD编程实例嵌入式系统基本概念
3.查询学生spark成绩中的前3名使用map转换数据,每条数据被分割成2列,表示学号和成绩,分隔符为“,”,存储为二元组格式,成绩要求转化为Int类型。
scala>val
m_spark=spark1.map{x=>valline=x.split(",");(line(0),line(1).trim.toInt)}通过sortBy对元组中的成绩列降序排序
scala>val
sort_spark=m_spark.sortBy(x=>x._2,false)通过take()操作取出每个RDD的前3个值
scala>sort_spark.take(3).foreach(println)7.4.4RDD编程实例嵌入式系统基本概念4.查询spark成绩90分以上的学生scala>val
filter_spark=m_spark.filter(x=>x._2>90)scala>filter_spark.foreach(println)5.查询spark成绩的最高分和最低分scala>val
max_spark=m_spark.values.maxscala>val
min_spark=m_spark.values.min7.4.4RDD编程实例嵌入式系统基本概念6.求spark课程的平均成绩scala>valp1_spark=m_spark.values.map(x=>(x,1.0)).reduce((x,y)=>(x._1+y._1,x._2+y._2))scala>valp2_spark=p1_spark._1/p1_spark._27.4.4RDD编程实例嵌入式系统基本概念7.输出每位学生所有科目的总成绩scala>valm_hadoop=hadoop1.map{x=>valline=x.split(",");(line(0),line(1).trim.toInt)}scala>valunion_hs=m_spark.union(m_hadoop)scala>valall_score=union_hs.reduceByKey((a,b)=>a+b)scala>all_score.foreach(println)7.4.4RDD编程实例嵌入式系统基本概念
8.输出每位学生的平均成绩
scala>val
pj_score=all_score.mapValues(x=>x/2.0)
scala>pj_score.foreach(println)7.5IDEA的安装和使用嵌入式系统基本概念IDEA全称IntelliJIDEA,是一个通用的集成开发环境,IntelliJIDEA在业界被公认为最好的scala和java开发工具之一。我们可以使用IDEA开发Spark独立应用程序,7.5.2IDEA的使用嵌入式系统基本概念在$SPARK_HOME/examples/src/main/scala/org/apache/spark/examples目录下,Spark自带了名为“SparkPi”的例子程序,该例子采用分布式估算的方法求圆周率。计算原理为:假设有一个正方形,边长是x,该正方形里面有一个内切圆,可以算出正方形的面积S等于x²,内切圆的面积C等于Pi×(x/2)²,于是就有Pi=4×C/S。可以利用计算机随机产生大量位于正方形内部的点,通过点的数量去近似表示面积。假设位于正方形中点的数量为Ps,落在圆内的点的数量为Pc,则当随机点的数量趋近于无穷时,4×Pc/Ps将逼近于Pi。7.5.2IDEA的使用嵌入式系统基本概念importscala.math.randomimportorg.apache.spark.sql.SparkSession/**Computesanapproximationtopi*/objectSparkPi{defmain(args:Array[String]):Unit={
valspark=SparkSession.builder.appName("SparkPi")/**如果在IDEA本地上运行需要加上.master("local"),如果要提交到Spark集群一定不能加.master("local")*/.master("local").getOrCreate()7.5.2IDEA的使用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年中国钼合金行业发展战略及前景趋势分析报告
- 2025-2030年中国透明聚丙烯行业运行状况及发展规划分析报告
- 2025-2030年中国过氧化二异丙苯行业运行现状及发展前景分析报告
- 2025-2030年中国苗圃产业市场十三五规划及发展建议分析报告
- 2025-2030年中国纳米银市场运行态势及投资战略研究报告
- 2025-2030年中国紫菜市场竞争格局与发展策略分析报告
- 2025-2030年中国管壳式换热器行业运行态势与未来发展战略研究报告
- 2025-2030年中国硬质纤维板行业运行态势及投资战略研究报告
- 天津师范大学津沽学院《半导体器件》2023-2024学年第二学期期末试卷
- 江西交通职业技术学院《测量学基础》2023-2024学年第二学期期末试卷
- 申请提取住房公积金个人授权、承诺书(样表)
- 施工作业申请表
- 浸出液的净化与沉积
- 银行间本币市场交易员资格考试真题模拟汇编(共586题)
- 苯乙酸安全技术说明书(msds)
- 幼儿园大班《防欺凌》教案5篇,幼儿园大班防欺凌活动教案
- 卫生管理初中级职称大纲
- 《当代网络文学作品发展研究6300字(论文)》
- 孟氏骨折与盖氏骨折讲解学习
- GB/T 9386-2008计算机软件测试文档编制规范
- GB/T 25137-2010钛及钛合金锻件
评论
0/150
提交评论