首先检查系统安装的mysql版本,使用命令 rpm -qa | grep mysql
若要安装自己的版本,则先执行删除操作 rpm -e xxxxx.rpm --nodeps
然后安装自己的版本, rpm -i xxxxx.rpm
远程连接mysql,操作步骤如下:
1、进入mysql环境中 mysql -uroot -proot
2、设置mysql,授权hive可以远程连接mysql数据库 grant all on hive.* to ‘root‘@‘%‘ identified by ‘root‘;
上面这句话的含义是,授权所有匹配hive表的任意位置的root用户,identified by ‘root‘,是说前面root用户的密码,我的root用户密码设置的也是root。
3、设置完成后,刷新一下 flush privileges;
创建表的两个步骤,首先创建一个表,然后给表加载数据。
创建一个表 CREATE TABLE t1(id int);
hive在hadoop中的表,实际上也是按文件系统的方式存放的,因此,可以给t1表中添加数据,可以有两种方式:
方式一,使用命令 LOAD DATA LOCAL INPATH ‘/usr/local/id‘ INTO TABLE t1;
方式二,直接使用命令 hadoop fs -put /usr/local/id /hive/t1
以上的id文件是在hadoop本地上。
创建多个字段的表t2
CREATE TABLE t2(id int,name string) FROM FORMAT DELIMITED FIELDS TERMINATED BY ‘\t‘;
然后在hadoop本地,例如/usr/local/目录下创建一个stu文件,里面包含两个字段,分别用制表符分隔开
然后添加到天t2中 hadoop fs -put /usr/local/stu /hive/t2
在hive中查询,除了select * from 语句,其他的所有语句都走mapreduce,因为select * from 是全盘扫描。
创建分区表
例如按天来存放表t3,
CREATE TABLE T3(id int) PARTITIONED BY (day int); 这句话含义是,安装天数来存放表t3
LOAD DATA LOCAL INPATH ‘/root/id‘ INTO TABLE t3 PARTITION(day=‘22‘);
LOAD DATA LOCAL INPATH ‘/root/id‘ INTO TABLE t3 PARTITION(day=‘23‘);
执行以上语句话会在hive表(对应在hadoop中是hive文件夹)中分别创建22和23两个文件夹,每个文件夹下面都有t3.
那么查询的时候可以使用 select * from t3 where day=22;
桶表
桶表是对数据进行哈希取值(使用hash值对桶的个数进行取模),然后放在不同的文件中存储
create table t4(id int) clustered by(id) into 4 buckets; //按照表中id那一列的hash值分配到4个桶中
set hive.enforce.bucketing = true;
insert into table t4 select id from t3; //根据id的hash值将t3中的数据分配到t4的每个桶中
注:t4中每个桶对应一个文件,里面存放中从t3表分配过来的数据。
分区表是使用文件进行划分,桶表使用文件进行划分。
外部表;
前面说的表都是内部表
外部表是存放在hive表外部的,通过时用命令
create external table t5(id int) location ‘/external‘;
可以创建一个外部表t5,他在hive中只是一个链接,在hive中删除t5,只是删除了这个链接,这个表中的内容在外部还是存在的。
java客户端操作hive:
即,在终端执行命令 hive --service hiveserver >/dev/null 2>/dev/null &
然后在eclipse中添加hive的lib目录下的jar包
package hive;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class App {
public static void main(String[] args) throws Exception{
Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");
//链接default的数据库
Connection con = DriverManager.getConnection("jdbc:hive://192.168.56.100:10000/default", "", "");
Statement stmt = con.createStatement();
//查询default数据库中的t1表
String querySQL="SELECT * FROM default.t1";
ResultSet res = stmt.executeQuery(querySQL);
while (res.next()) {
System.out.println(res.getInt(1));//注意数据库中列是1开始的
}
- }
}