一、命令:

 

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的值。

也可以混合使用动态分区和静态分区,注意静态分区必须出现在动态分区之前。

动态分区默认没有开启。开启后默认以严格的模式执行,这助于因设计错误而导致查询产生大量的分区。

附上动态分区属性:

 

hive use 模块 hive.warehouse.subdir.inherit.perms_hdfs

 

六、查询函数:

 

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