Hive安装:
JDK1.6以上
Hadoop要启动
Hive下载:http://apache.cs.utah.edu/hive/hive-0.11.0/
HIve解压:
将hive-0.11.0.tar.gz解压到/home/hive路径下
tar -zxvf hive-0.11.0.tar.gz
产生hive的安装目录/home/hive/hive-0.11.0
配置环境变量:
sudo vi /etc/profile
export HIVE_HOME=/home/hive/hive-0.11.0
export PATH=$HIVE_HOME/bin:$PATH
执行./etc/profile或source /etc/profile
启动hive:
hive
show databases;//查看有哪些数据库
use mytest;//使用数据库
show tables;//显示所有的表
Hive HA原理:
将若干hive实例纳入一个资源池,然后对外提供一个唯一的接口,进行proxyrelay。
对于程序开发人员,就把它认为是一台超强hive就可以了,每次它接收到一个HIVE查询连接后,都会轮询资源池里可用的hive资源。用HAProxy实现。
Hive的元数据存储到Mysql
Hive的默认元数据信息存在Derby里面,内置的Derby是单session的。即一次只能连接一个客户端。
Mysql配置:
hive-site.xml文件:
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc.mysql://192.168.1.45:3306/hive?characterEncoding=UTF-8</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>
</configuration>
Hive数据类型:
基本数据类型:
TINYINT:1个字节(8位)有符号整数
SMALLINT:2个字节有符号整数
INT:4个字节有符号整数
BIGINT:8个字节有符号整数
FLOAT:4个字节单精度浮点数
DOUBLE:8个字节双精度浮点数
BOOLEAN:true/false
STRING:字符串
复合数据类型:
ARRAY:一组有序字段,字段的类型必须相同 Array(1,2)
MAP:一组无序的键值对,键的类型必须是原子的,值可以是任何类型,同一个映射键的类型必须相同,值的类型也必须相同。 Map('a',1,'b',2)
STRUCT:一组命名的字段,字段类型可以不同 Struct('a',1,2,0)
创建Hive表:
create [External] Table [if not exits] table_name
[{col_name datatype[comment col_comment],...}]
[COMMENT table_comment]
[PARTITIONED by (colname datatype[comment col_ment],...)]
[CLUSTERED BY (colname,colname,...)[SORTED BY (colname[ASC|SESC],...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED as file_format]
[LOCATION hdfs_path]
内部表:
create table test_table(
id int,
name string,
num int) row format delimited fields terminated by ','
stored as textfile
外部表:
create external table test_table(
id int,
name string,
num int) row format delimited fields terminated by ','
stored as textfile;
加载数据:
本地加载数据:
load data local inpath '/tmp/20150525/stu.txt' [overwrite] into table hive_test
HDFS加载数据:
load data inpath '路径' [overwrite] into table 表名
Hive与SQL的对比:
hive sql
数据插入 支持批量插入 支持单条和批量导入
数据更新 不支持 支持
索引 支持 支持
分区 支持 支持
执行延迟 高 低
扩展性 好 有限
Hive的访问方式:
1.客户端
2.hwi
hive --service hwi
3.hive server 远程访问
hive --service hiveserver &
创建一个java项目
class HiveJDBCConnection{
private static String driverName="org.apache.hadoop.hive.jdbc.HiveDriver";
private static String url = "jdbc:hive://192.168.1.45:10000/test";
private static String userName="root";
private static String password="root";
private static String sql="";
public static void main(String[] args){
try{
Class.forName(driverName);
Connection conn = DriverManager.getConnection(url,uerName,password);
Statement stmt = conn.createStatement();
//system.out.prinln(stmt);
//创建一个表,如果存在了就删除
String tableName = "jdbc_table";
sql = "drop table "+tableName;
stmt.execute (sql);
//创建表
sql = "create table "+tableName+
" (key String,value String) row format delimited fields terminated by ','";
stmt.execute(sql);
//load数据到jdbc_table表中
String path = "/home/sml/hive_test.txt";
sql = "load data local inpath '"+path+"' into table "+tableName;
stmt.execute();
//查询jdbc_table中的数据
sql ="select * from "+tableName;
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
String result = rs.getString(1)+"\t"+rs.getString(2);
System.out.println(result)
}
}catchh(Exception e){
System.out.println("没有找到驱动!");
e.printStackTrace();
}
}
}
Hive常用功能:
参数:
YEAR=2015 hive-e "select * from table where yaer=${env:YEAR}"
Hive 的一次命令
hive -e "select * from table limit 3"
Hive的结果存到本地
hive -S -e "select* from table limit 3" >> /tmp/mydata
Hive查找
hive -S -e "set"|grep warehouse
执行hive文件
hive -f /path/to/file/mydata.sql
查看当前路径
! PWD
hive里面执行shell命令
! /bin/echo "helloWorld"
查看HDFS
dfs -ls /tmp