用户手册:
https://cwiki.apache.org/confluence/display/Hive/Home#Home-UserDocumentation
1>
java客户端操作hive需要启动hive远程服务:hiveserver2
https://cwiki.apache.org/confluence/display/Hive/Setting+Up+HiveServer2
$HIVE_HOME/bin/hive --service hiveserver2
2>参考:beeline shell
Hiveserver2 支持一个新的命令行Shell为Beeline,它是基于SQLLine CLI的JDBC客户端。
Beeline支持嵌入模式(embedded mode)和远程模式(remote mode)。在嵌入式模式下,
运行嵌入式的Hive(类似下面的Hive CLI),而远程模式可以通过Thrift连接到独立的HiveServer2进程上.
进入beeline命令行如下:
1. $HIVE_HOME/bin/hive --service hiveserver2
2.
修改hadoop 配置文件 etc/hadoop/core-site.xml,加入如下配置项
<property>
<name>hadoop.proxyuser.root.hosts</name> ----root 换成自己环境中的用户
<value>*<value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
3. $HIVE_HOME/bin/beeline
[root@rhel64-64bit bin]# beeline
Beeline version 2.3.3 by Apache Hive
beeline> !connect jdbc:hive2://127.0.0.1:10000
Connecting to jdbc:hive2://127.0.0.1:10000
Enter username for jdbc:hive2://127.0.0.1:10000: root
Enter password for jdbc:hive2://127.0.0.1:10000: ********
Connected to: Apache Hive (version 2.3.3)
Driver: Hive JDBC (version 2.3.3)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://127.0.0.1:10000> show databases;
+----------------+
| database_name |
+----------------+
| default |
| yoyo2 |
+----------------+
3 rows selected (25.382 seconds)
0: jdbc:hive2://127.0.0.1:10000>
3>
进入hive cli模式操作hive:
$HIVE_HOME/bin/hive
或者
hive --service cli 也可以进入cli模式
hive --help查看hive的可选参数
hive -S 静默模式不输出mapre过程
打开debug模式:
hive -hiveconf hive.root.logger=DEBUG,console
hive 命令主要分为以下几类:
进入与退出hive交互:hive/quit/exit
参数设置:set/reset
资源文件管理:add/list/delete
执行shell命令:!操作系统命令
hdfs文件操作命令: dfs -ls /dfs -cat
执行外部文件:如source file
hiveQL:DDL/DML语句等
参数设置:set/reset(这里修改只对该会话生效,如要永久生效需要修改hive-site.xml文件)
set;列出所有参数,
set map使用tab键 和 linux 一样
hive -e "set;"|grep task
hive> set mapreduce.job.reduces; ---查看原始值
mapreduce.job.reduces=-1
hive> set mapreduce.job.reduces=10; ---修改为10
hive> set mapreduce.job.reduces; ---查看修改成功
mapreduce.job.reduces=10
hive> reset mapreduce.job.reduces;---重置参数
hive> set mapreduce.job.reduces; ----参看重置成功
mapreduce.job.reduces=-1
hive> set hive.cli.print.current.db=true;---显示当前的数据库
hive (default)>
hive> set hive.fetch.task.conversion; ---简单查询不需要转换成mapr作业
hive.fetch.task.conversion=more
hive -e "set;" |grep map ---查看包含map的参数
执行shell命令:!命令 例如:!pwd
hive (default)> !pwd; ---输出就是在linux上执行pwd的结果一样
/root/Desktop
hdfs文件操作命令: dfs -ls /dfs -cat
dfs -ls -R /user;
执行外部文件:如source file
source my.sql;mysql里面就是select 语句如:select * from table1;
hiveQL语句:
show functions; ---查看内置函数
select current_timestamp();---使用函数;
也可以自定义函数:
需要继承org.apache.hadoop.hive.ql.UDF ,需要实现evaluate函数支持重载
1.先开发一个简单的Java类
import org.apache.hadoop.hive.ql.exec.UDF;
public final class nadd extends UDF {
public Integer evaluate(Integer a, Integer b) {
if (null == a || null == b) {
return null;
} return a + b;
}
2.添加jar包
hive >add jar /home/lan/jar/nadd.jar;
3.创建临时函数与开发好的class关联起来
hive >CREATE TEMPORARY FUNCTION myadd AS 'demo.udf.nadd';
4.使用自定义函数
hive >SELECT myadd(num1, num2) FROM t2;
5.销毁临时函数:
hive >DROP TEMPORARY FUNCTION myadd;
DDL语句:
hive的数据类型:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-NumericTypes
复杂的数据类型例子:
array类型:
create table tt(id int, name string, grades array<map<string,float>> );
表数据为: 1, tom, [<'chinese',90>, <'english',96>, <'music',79>]
struct类型:
create table tt(id int, info struct<name:tring,age:int,sex:string>);
表数据为: 1, {'tom', 13, 'F' }
创建内部表:
create table t1 ( id int,name string,gender string) ---创建的是内部表
row format delimited fields terminated by ',' ---表字段以逗号分隔存放在文件中
location '/input' ----指定表存放位置,
默认是放在hdfs的 /user/hive/warehouse/目录下的
partitioned by (gender string) ----指明为分区表,在hdfs的/user/hive/warehouse/t1会为分区生成不同目录
clustered by(id) into 3 buckets; ----指明为桶表,Hive里的分桶=MapReduce中的分区,而Hive中的分区只是将数据分到了不同的 文件夹
创建外部表:只是建立和hdfs上的文件的链接关系,drop table并不能把hdfs上的文件删除
create external table t1 ( id int,name string,gender string)
location '/input'; ---与hdfs上的/input下面的文件建立链接关系
创建表的时候同时导入数据: 也可以使用 load
create table t2
row format delimited fields terminated by ','
as select * from t1;
修改表结构:
alter table t1 add columns(score int);
DML语句:
hive是一个高延时用于海量数据分析的数据仓库,它不支持单条数据插入,新版本有支持单条记录的修改,
只是限制颇多只是针对 tables that support ACID如下:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Update
批量导入数据:
---从本地/hive/1.txt导入数据到表t1中的gender='M'分区中,如果是hdfs上文件则不用加local参数
load data local inpath '/hive/1.txt' overwrite into table t1 partition (gender='M');
insert into t1 partition (gender='M') select * from t2 where gender='M';
查询语句:大多与mysql还是类似的:
select * from t1 where name='tom';
explain select * from t1 where name='tom'; 输出结果是从下往上读
4>使用sqooq导入mysql数据到hive中:
bin/sqoop import \
--connect jdbc:mysql://127.0.0.1:3306/testdb \
--username root2 \
--password password2 \
--query 'select * from t2 where age>12 and $CONDITIONS LIMIT 20' \
--num-mappers 1 \
--target-dir '/sqooq/t2' \
--hive-tables t2