一、命令:
1. “一次性执行”:
hive -e "select * from mytable limit 3";
2. 输出到文件中:
-S :静默模式
hive -S -e "select * from mytable limit 3" > /tmp/myquery
3. 模糊查找“warehouse”的路径:
[root@** config]# hive -S -e "set" | grep warehouse;
hive.metastore.warehouse.dir=/user/hive/warehouse
hive.warehouse.subdir.inherit.perms=true
4.从文件中查询:
hive -f /path/to/file/query.hql
一般文件保存为 .q 或 .hql 后缀 ,在hive shell 中使用 source。
hive> source /path/to/file/query.hql
5. hive 内部使用 dfs 命令:
hive> dfs -ls /;
Found 12 items
drwxrwxrwx - trafodion trafodion 0 2017-08-25 17:30 /bulkload
drwxr-xr-x - hdfs supergroup 0 2017-06-27 15:06 /cy
drwxr-xr-x - hbase hbase 0 2017-08-24 16:31 /hbase
drwxr-xr-x - hbase hbase 0 2017-08-24 15:31 /hbase-staging
drwxr-xr-x - trafodion trafodion 0 2017-08-24 15:31 /lobs
drwxr-xr-x - hdfs supergroup 0 2017-06-26 14:25 /opt
drwxr-xr-x - hdfs supergroup 0 2017-07-18 15:16 /pacc
drwxr-xr-x - hdfs supergroup 0 2017-09-06 15:59 /pcc
drwxr-xr-x - hdfs supergroup 0 2017-07-23 03:55 /test
drwxrwxrwt - hdfs supergroup 0 2017-09-06 13:42 /tmp
drwxrwxrwx - trafodion trafodion 0 2017-08-24 15:31 /trafodion_backups
drwxr-xr-x - hdfs supergroup 0 2017-08-30 14:37 /user
6. 设置显示字段名称,默认是关闭的:
hive> set hive.cli.print.header=true;
7.设置在使用hive时避免产生MapReduce:
set hive.exec.mode.local.auto=true;
二、数据类型和文件格式
基本数据类型省略。
hive支持列使用struct , map , array 等集合数据类型。
例如:
create table employees (
name string,
salary float,
subordinates Array<string>,
deductions Map<string, float>,
address Struct<street:string, ciity: string, state:string,zip:int>
);
三、创建表
管理表:
也是内部表,当删除一个管理表时,hive也会删除这个表中的数据、管理表不方便和其他工作共享数据。
外部表:
create external table if not exists stocks(
exchange string,
symbol string,
... ...
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/data/stocks';
关键字 external告诉hive这个表示外部的,后边的location告诉hive数据位于哪个路径下。删除表示不会删除这份数据,但是描述表的元数据信息会被删除。
四、修改表
1.重命名
alter table a rename to b;
2.增删表分区
alter table a add if not exists
partition (year = 2011,month=1,day = 1) location '/logs/2011/1/1';
五、向表中插入数据
hive中没有行级别的数据插入,更新和删除操作。
1. 从文件中加载数据:
load data local inpath '/path/california-employees'
overwrite into table employees
partition (county = 'us' , state = 'ca')
如果分区目录不存在的话,会先创建分区目录,再将数据拷贝到改目录下。
如果是非分区表就可以省略partition子句。
如果省略掉local关键字,那么文件路径应该是分布式文件系统中的路径。
如果用了overwrite关键字,那么目标文件夹中之前的数据会被先删除掉。如果没有,仅仅会把新增的文件增加到目标文件夹中而不会删除之前的数据。
inpath子句中使用文件路径有个限制,就是路径下不可以包含任何文件夹。
2. 通过查询语句向表中插入数据:
insert overwrite table emp partition (country = 'US', state = 'OR')
select * from s_emp se
where se.cnty = 'US' and se.st = 'OR';
3.动态分区插入:
insert overwrite table emp partition (country , state)
select ..., se.cnty, se.st from s_emp se;
hive 根据select语句最后两列来区分字段country和state的值。
也可以混合使用动态分区和静态分区,注意静态分区必须出现在动态分区之前。
动态分区默认没有开启。开启后默认以严格的模式执行,这助于因设计错误而导致查询产生大量的分区。
附上动态分区属性:
六、查询函数:
1.groupby语句:
GROUP BY 语句通常和聚合函数一起使用,按照一个或者多个列对结果进行分组,然后对每个组进行聚合操作。
select year(ymd), avg(price) from stocks group by year(ymd);
2.having 语句:
允许用户通过一个简单的语法完成原本需要通过子查询才能对group by 语句产生的分组进行条件过滤的任务。
SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer HAVING SUM(OrderPrice)<2000