二、Java基础
在Hadoop为主导的大数据处理技术生态圈的编程语言中,Java语言有不可撼动的地位。Hadoop 是用Java写的,不仅分布式编程框架 Map/Reduce 原生支持Java, 而且Hbase、Spark等都支持Java API 开发。学习和掌握Java相关知识,对学习大数据相关技术十分重要。本节就Java概念(如面向对象和泛型、Java数据结构、反射、内部类等)进行概述。
(一)面向对象与泛型
1、类继承
在面向对象语言中,类继承是面向对象程序设计不可缺少的一部分。 类继承实现了代码复用,使得代码结构更清晰。 当一个类继承另一个类,不仅可以获取该类的一些方法,还可以在此基础上定义自身的方法,从而能够在已存在的类的基础上构建一个新类。
2、接口
接口以interface声明。在Java语言中,接口是一个抽象类型,是抽象方法的组合。与Java中的类不同,接口主要用来描述类具有的功能,并不涉及每个功能的具体实现。当类实现接口时,必须实现接口中的所有方法。若只想实现接口中的部分方法,可使用抽象类。从程序员的角度,可以把接口理解为抽象类(虽然它们在语法上有诸多不同)。接口中的方法必须全部在具体的类中实现。接口的实现一般分为两步:
(1)使用implements关键字将类声明为实现指定的接口;
(2)在类中实现接口已定义好的所有方法。
接口也可以通过extends关键字继承父接口,并支持多继承。java.io 包字节流 InputStream 和 OutStream 都实现了 Closeable 接口,用来关闭数据源或者目标的 io 流,释放对象保存的资源。
3、泛型
泛型是Java SE5中引入的一种重用机制。泛型实现了参数类型的概念,使代码可以应用于多种类型。与Java中指定变量的参数类型不同,泛型将所操作的数据类型指定为一个参数,即类型参数,使算法可以同时操作多种数据类型,同时能够在编译时检测到非法类型。使用类型参数允许暂时不指定参数的具体类型,而是稍后再决定具体类型。
Java语言中应用了泛型技术的方法,称为泛型方法,拥有泛型方法的类可以不是泛型类。泛型方法可以放在普通类中,也可以放在泛型类中,泛型类与泛型方法没有直接的关系。类型参数的声明用尖号表示,尖括号内可以包含一个或多个类型参数,类型参数只能使用引用类型,不能用 int、float 等原始类型替换。
(二)集合类
Java集合框架的集合类,有时候称之为容器。容器的种类有很多种,比如ArrayList、LinkedList、HashSet等。每种容器都有自己的特点,比如,ArrayList底层维护的是一个数组;LinkedList是链表结构;HashSet依赖的是哈希表,每种容器都有自己特有的数据结构。在Map/Reduce编程中,在计算节点传输键值数据的传输是一种集合,理解Java语言中Set、Map和List有助于对Map/Redcue数据传递程序的理解。
1、Set
Set是一种简单的集合,继承Java中的Collection接口。Set中的元素不能重复,后放入的元素会将之前重复的元素覆盖,但Set中的元素没有特定顺序。
2、Map
Map也被称为关联数组,用于存储键值对结构的数据,这种数据结构就像字典一样,在某些对象与另外一些对象之间建立联系,即在“键”与“值”之间建立联系,在代码中能够根据键值对中的键来查找对应的值。键值对在MapRedcue编程和Spark编程中会多次使用。Map接口主要有如下两个实现类。
(1)HashMap:HashMap类存取数据集合中元素的方式是根据哈希码的算法计算得来的,能够快速查找一个键,具有存取速度快的特点。
(2)TreeMap:TreeMap类Map接口中的元素按序排放,要求放入集合中的元素是可排序的。
3、List
List又称列表,对Java中的Collection接口进行了扩充,其中的元素以线性方式存储,在List中的元素根据放入的顺序不同存放在不同的位置,并且元素可以重复。 除了关心不同集合类型的数据结构不同之外,我们还要关心数据集合本身是否支持自动排序和是否允许重复序列两个问题。为了使对容器内元素的操作更为简单,Java引入了迭代器模式。把访问逻辑从不同类型的集合类中抽取出来,从而避免向外部暴露集合的内部结构。
(三)内部类与匿名类
在Java中,内部类定义在另一个类的内部,属于这个类的一部分,外面的类称为外部类或外围类。由于内部类在外部类的内部,当实例化内部类时,该内部类会获取外部类对象的引用,该引用使得实例化的内部类对象可以访问外部类的成员。所以内部类可以自由访问外部类的数据,包括私有数据。由于内部类属于外部类的一部分,其他类无法直接访问该内部类。在编译时,内部类和外部类属于两个完全不同的类,会产生两个不同的 .class 文件。内部类一般分为四种,成员内部类、局部内部类、匿名内部类和静态内部类。
1、成员内部类
成员内部类是一种最基础的内部类,是外部类所有成员中的一个。成员内部类可以访问外部类的所有成员属性和成员方法。但是如果外部类要想访问成员内部类,必须先创建一个成员内部类的对象,再通过成员内部类的对象来访问。成员内部类可以像外部类中的变量和方法一样拥有各种访问权限,包括private访问权限、protected访问权限、public访问权限及包访问权限。
2、局部内部类
局部内部类有两种情况,一种是定义在外部类的一个方法的内部,另一种情况是定义在外部类一个作用域的内部,只能在该方法内部或者该作用域内部被访问,并且局部内部类不能有private、protected、public或者static修饰符。
3、匿名内部类
匿名内部类比较常见,它直接使用new关键字来隐式地生成一个类或者接口的对象,并同时实现该类或者接口中的方法。匿名内部类的使用方式有两种:实现一个接口,并实现该接口定义的方法,或者继承一个父类,重写其方法。
4、静态内部类
静态内部类是定义在类的内部,并且使用static关键字修饰的内部类,静态内部类又称为嵌套内部类。与一般内部类不同,静态内部类没有对外围内部类的引用,所以它无法使用外部类的非static类型的成员变量或方法。静态内部类不需要通过外部类来创建,可以直接创建静态内部类的对象。
(四)反射
Java的反射机制允许Java在程序运行过程中获取程序的某些信息,通过反射机制,可以在程序运行时获取程序内部的接口、变量等信息,还可以在运行过程中实例化对象,这些操作在编译期无法得知,不需要程序预先编译,都是在程序运行时进行的。
Java反射机制广泛运用于开发各种通用框架中,它允许程序在运行过程中根据不同需求调用不同方法,加载不同的对象和类,使得程序具有更高的灵活性,降低了类之间的耦合性。在Java中,实现反射的类一般在java.lang.reflect包里,反射所能实现的功能包括获取Class对象、捕获异常、利用反射分析类的能力,在运行过程中利用反射分析对象等。
三、SQL语言基础
1986年10月,美国国家标准协会对SQL进行了规范,以此作为关系式数据库管理系统的标准语言(ANSI X3. 135-1986)。不过不同的数据库系统在其实践过程中都对SQL规范作了某些改编和扩充。Hadoop生态圈的 Hive、Spark 等也仿照SQL语言提出了自己的类SQL语言,用于数据的查询和分析等。
定义:结构化查询语言(Structured Query Language,SQL)是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
基本操作:创建数据表、在数据小添加信息、在数据表查询信息、在数据表修改信息、在数据表删除信息、修改表的结构。
(一)创建数据表
语法格式:CREATE table 表名 (数据名称 数据类型,数据名称 数据类型,…);
创建一个学生信息表,学生属性有学号、姓名、性别、年龄:
CREATE table student (sid int, sname varchar(20), ssex varchar(2), sage int);
(二) 在数据表添加信息
语法格式:INSERT INTO 表名(数据名称1,数据名2,…) VALUES(字段值1,字段值2, …);
1、插入所有字段,一次性加入一条完整的信息,插入的字段值的个数和数据表的属性个数相同。
INSERT INTO student(sid, sname, ssex, sage) VALUES(2017001, '小明', '男', 22);
2、向数据表student插入sid为2017001,sname为小明,ssex为男,sage为22的一条记录。此时可以省student后面的属性,等同于
INSERT INTO student VALUES(2017001, '小明', '男', 22);
3、 插入部分字段,在表名后面添加需要插入的属性名,在VALUES后面添加对应的值:
INSERT INTO student(sid, sname) VALUES(2017002, '小明');
(三)在数据表查询信息
语法格式:SELECT 数据名称 FROM 表名 WHERE 数据名称 = 数据值;
1、简单信息查询
(1)查询学生表中的所有学号(可以添加多个属性,用逗号隔开),语法格式为:
SELECT sid FROM student;
(2)在查询的同时,也可以用AS为数据名称制定别名,例如:
SELECT sid AS snumber FROM student;
(3)查询数据表student中学号为2017001的学生信息,语法格式为:
SELECT * FROM student WHERE sid=2021001;
2、数据库表的聚合查询和条件查询
(1)常用的聚合函数有:max()、min()、sum()、avg()、count()。
(2)常用的比较条件有:<、>、>=、<=、== 、<>!=,例:
SELECT * FROM student WHERE sage>20;
(3)常用的逻辑条件有:and、or,例:
SELECT * FROM student WHERE sid=2017001 OR sname='小王';
(4)常用的判空条件(null空字符串):is null、is not null,例:
SELECT * FROM student WHERE sage IS NULL;
(5)常用的模糊条件(like) 例:
SELECT * FROM student WHERE sname LIKE '小_';(_表示一个字或字符) SELECT * FROM student WHERE sname LIKE '小%';(%表示不限制字符个数)
(四)在数据表修改信息
1、修改所有数据,一般这种情况比较少用。例:
UPDATE student SET sage=12;
2、带条件的修改
UPDATE student SET sage=12 WHERE id=1; 在SET后面也可以进行多个数据名称的修改。例:
UPDATE student SET sage=12, ssex=’女’WHERE id=1;
(五)在数据表删除信息
语法格式:DELETE FROM 表名 WHERE 数据名称 = 数据值;
删除特定条件的某条数据(不加WHERE进行限制就是删除所有数据),例:
DELETE FROM student WHERE id=2021001;
(六)修改表的结构
1、添加一个字段,在表中增加一列属性。例:
ALTER TABLE student ADD column sclass varchar(20);
2、删除一个字段,在表中删除一列属性。例:
ALTER TABLE student DROP column sclass;
3、修改表中某一个字段的类型。例:
ALTER TABLE student MODIFY (column) sname varchar(50);
4、修改表中某一个字段的名称。例:
ALTER TABLE student CHANGE (column) sname name varchar(20);
5、修改数据表的名称。例:
ALTER TABLE student RENAME(to)people;