一、安装hive的机器上要有hadoop的环境
hadoop集群搭建参考博客地址 https://my.oschina.net/xiaozhou18/blog/787902
二、现在机器上安装mysql数据库 用来存储hive的元数据信息 命令如下
rpm -qa | grep mysql 查看机器上的mysql信息
rpm -e mysql-libs-5.1.66-2.el6_3.i686 --nodeps 删除已安装的mysql
rpm -ivh MySQL-server-5.1.73-1.glibc23.i386.rpm 安装mysql 服务端
rpm -ivh MySQL-client-5.1.73-1.glibc23.i386.rpm 安装mysql 客户端
mysql> use mysql;
mysql> UPDATE user SET password=password("test123") WHERE user='root'; 修改mysql密码
mysql>GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY '123' WITH GRANT OPTION; 允许用mysql客户端远程登陆mysql服务
mysql> flush privileges;
mysql> exit;
登陆mysql
mysql -u root -p123
三、安装hive
1、解压hive 命令 [root java]# tar -zxvf apache-hive-1.2.1-bin.tar.gz 。
2 、复制一份hive的配置文件 命令[root conf]# cp hive-default.xml.template hive-site.xml
3、修改hive-site.xml的配置文件 内容如下
<configuration>
<property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://node11:3306/hive?createDatabaseIfNotExist=true</value> <description>JDBC connect string for a JDBC metastore</description> </property><property>
<name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore</description> </property><property>
<name>javax.jdo.option.ConnectionUserName</name> <value>root</value> <description>username to use against metastore database</description> </property><property>
<name>javax.jdo.option.ConnectionPassword</name> <value>123</value> <description>password to use against metastore database</description> </property> </configuration>四、安装hive和mysq完成后,将mysql的连接jar包拷贝到$HIVE_HOME/lib目录下
五、启动hive 命令 hive/bin/hive
如果出现java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected这个错误表示hive 的 jline-xxx.jar 和hadoop的jline-xxx.jar 版本不一致 把$hive_home/lib下的jline-xxx.jar 复制到$hadoop_home/share/hadoop/yarn/lib下 重启hive。 看到如下界面表示进入到hive命令行模式。
六、简单使用
创建表 create table trade_detail(id bigint, account string, income double, expenses double, time string) row format delimited fields terminated by '\t';
向表里添加数据
load data local inpath '/home/hadoop/data/trade_detail' overwrite into table trade_detail;七、hive的脚本执行
$>hive -e “” 可以在hive shell环境下直接执行hive命令 如 ./hive –e ‘show tables’
$>hive -e “”>aaa 把执行hive shell命令后查询的结果导入aaa文件内
$>hive -S -e “”>aaa -S 执行速度快
$>hive -f file 执行file文件内的hive shell 命令
八、hive和hdfs 或liunx交互
与linux交互命令 !
!ls
!pwd
与hdfs交互命令
dfs -ls /
dfs -mkdir /hive
九、创建表
1、复合类型-struct
create table student_test(id INT, info struct<name:STRING, age:INT>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY ':';
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 表示字段之间用逗号分割
COLLECTION ITEMS TERMINATED BY ':' 表示集合之间用冒号分割
查字段数据info.name 查询
2、复合类型-Array
create table class_test(name string, student_id_list array<INT>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY ':';
查字段数据student_id_list[0]查询
3、复合类型—Map使用
create table employee(id string, perf map<string, int>) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' COLLECTION ITEMS TERMINATED BY ',' MAP KEYS TERMINATED BY ':';
查字段数据用perf['字段名']
十、对表的操作
DROP DATABASE [IF EXISTS] mydb CASCADE; 级联删除mydb下的所有表
DESCRIBE DATABASE extended mydb; extended查看mydb的扩展信息
CREATE TABLE t2 LIKE t1; 创建和t1表结构一样的表
Hive>desc formatted t1; 格式化 显示t1表的详细结构
SHOW TABLES in mydb; 查看mydb下的表
十一、对列的操作
修改列的名称、类型、位置、注释
hive>ALTER TABLE t3 CHANGE COLUMN old_name new_name String COMMENT '...' AFTER column2;
增加列
hive>ALTER TABLE t3 ADD COLUMNS(gender int);
十二、表的种类
1、管理表 也叫内部表
默认创建表时 就是内部表 内部表在删除表时 会删除表的元数据信息和hdfs上的真实数据
2、外部表
hive>create external table external_table1 (key string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' location '/home/external';
在HDFS创建目录/home/external
#hadoop fs -put /home/external_table.dat /home/external
加载数据
LOAD DATA INPATH '/home/external_table1.dat' INTO TABLE external_table1;
查看数据
select * from external_table
select count(*) from external_table
删除表
drop table external_table
删除外部表的时候 只会把表的元数据信息删除 不会删除hdfs上的数据
3、分区表
分区表避免了全表扫描
CREATE TABLE t3(name string) PARTITIONED BY (province string);
SHOW PARTITIONS t3 [partition (province='beijing')]; 显示t3表的分区
ALTER TABLE t3 ADD [IF NOT EXISTS] PARTITION(province='beijing') ; 增加分区
ALTER TABLE t3 DROP PARTITION(...); 删除分区
创建表
create table partition_table(rectime string,msisdn string) partitioned by(daytime string,city string) row format delimited fields terminated by '\t' stored as TEXTFILE;
加载数据到分区
load data local inpath '/home/partition_table.dat' into table partition_table partition (daytime='2013-02-01',city='bj');
查看数据
select * from partition_table
select count(*) from partition_table
•删除表 drop table partition_table
添加防止删除的保护:
hive> alter table tablename partition (day='0925') enable no_drop;添加防止查询的保护:
hive> alter table tablename partition (day=20161207') enable offline; 删除防止查询的保护: hive> alter table tablename partition (day='20161207') disable offline;4、桶表
桶表用来抽样查询的
桶表是对数据进行哈希取值,然后放到不同文件中存储。
创建表
create table bucket_table(id string) clustered by(id) into 4 buckets;
加载数据
set hive.enforce.bucketing = true; 启用桶表
insert into table bucket_table select name from stu;
insert overwrite table bucket_table select name from stu;
数据加载到桶表时,会对字段取hash值,然后与桶的数量取模。把数据放到对应的文件中。
桶表的抽样查询
select * from bucket_table tablesample(bucket 1 out of 4 on id);
tablesample是抽样语句
语法解析:TABLESAMPLE(BUCKET x OUT OF y)
y必须是table总bucket数的倍数或者因子。
hive根据y的大小,决定抽样的比例。
例如,table总共分了64份,当y=32时,抽取(64/32=)2个bucket的数据,当y=128时,抽取(64/128=)1/2个bucket的数据。x表示从哪个bucket开始抽取。
例如,table总bucket数为32,tablesample(bucket 3 out of 16),表示总共抽取(32/16=)2个bucket的数据,分别为第3个bucket和第(3+16=)19个bucket的数据。