hive一次使用命令:
$ hive -e "select * from mytable limit 1;" OK name1 1 name2 2 Time taken: 3.935 seconds $ hive -e "select * from mytable limit 1;" > /tmp/myfile $ cat /tmp/myfile OK name1 1 name2 2 Time taken: 3.935 seconds
静默模式:
$ hive -S -e "select * from mytable limit 1;" > /tmp/myfile $ cat /tmp/myfile name1 1 name2 2
从文件中执行Hive查询:
$ hive -f /tmp/queries.hql
在Hive shell中可以使用source命令来执行一个脚本文件:
$ cat /tmp/queries.hql select * from mytable limit 1; $ hive hive> source /tmp/queries.hql; ...
执行shell命令:
用户不需要退出hive cli就可以执行简单的bash shell命令。只要在命令前加上!并且以分号(;)结尾就可以。
hive> ! /bin/echo "hello, world!"; "hello, world";
hive cli中不能使用需要用户进行输入的交互式命令,而且不支持shell的管道功能和文件名的自动补全功能。例如,! ls *.hql; 这个命令表示的是查找名为*.hql的文件,而不是表示显示以.hql结尾的所有文件。
在hive内使用hadoop的dfs命令
用户可以在hive cli中执行hadoop的dfs命令,只需要将hadoop命令中的关键字hadoop去掉,然后以分号结尾就可以了。
hive> dfs -ls / ; Found 2 items drwxr-xr-x - root supergroup 0 2014-11-06 12:00 /flag drwxr-xr-x - root supergroup 0 2014-11-07 15:00 /user
hive脚本中如何进行注释
用户可以使用以--开头的字符串来表示注释,例如:
-- Copyright 2012 -- This is a test select * from mytable limit 1;
支持的数据类型:
数据类型 长度
tinyint 1byte有符号整数
smalint 2byte有符号整数
int 4byte有符号整数
bigint 8byte有符号整数
boolean 布尔类型
float 单精度浮点数
double 双精度浮点数
string 字符串
timestamp 整数,浮点数或字符串
binary 字节数组
timestamp
整数:距离1970-01-01 00:00:00的秒数
浮点数:1970-01-01 00:00:00的秒数,精确到纳秒(小数点后保留9位数)
字符串:YYYY-MM-DD hh:mm:ss.ffffffff
timestamp表示的是UTC时间,hive提供了不同时区相互转换的内置函数:to_utc_timestamp和from_utc_timestamp
binary可以在记录中包含任意字节,这样可以防止hive尝试将其作为数字、字符串等进行解析。
集合数据类型
1)struct
和c语言中的struct或对象类似。都可以通过"."符号访问元素内容。例如,如果某个列的数据类型是struct{first,last},那么第一个元素可通过字段名.first来引用。
2)map
例如,有一个map的键值对为‘first‘->‘name‘,可通过字段名[‘first‘]来访问该元素
3)array
例如,数组值为[‘name‘],那么第一个元素可通过数组名[0]来访问「
下面是一个创建表的语句示例:
create table employee ( name string, age tinyint, salary float, subordinates array<string>, address struct<country:string,province:string,city:string,street:string> );
hive中默认的记录和字段分隔符
\n:每行都是一条记录
^A(Ctrl+A):用于分隔字段(列),在create table语句中可以使用八进制编码\001表示
^B:用于分隔array或struct中的元素,或用于map中键-值对之间的分隔。在create table语句中可以使用八进制编码\002表示
^C:用于map中键-值对之间的分隔。在create table语句中可以使用八进制编码\003表示
上面的建表语句和下面的是一样的:
create table employee ( name string, age tinyint, salary float, subordinates array<string>, address struct<country:string,province:string,city:string,street:string> ) row format delimited fields terminated by '\001' collection items terminated by '\002' map keys terminated by '\003' lines terminated by '\n' stored as textfile;
其中,row format delimited这组关键字必须要写在其他字句(除了stored as ...)之前。
HiveQL:数据定义
HiveQL是Hive查询语言,它不完全遵守任一种ANSI SQL标准的修订版。Hive不支持行级插入操作、更新操作和删除操作。Hive也不支持事务。
hive中数据库的概念本质上是表的一个目录或者命名空间。然而,对于有很多组和用户的大集群来说,这样可以避免表命名冲突。
如果用户没有显式的指定数据库,那么将会使用默认的数据库default。
下面展示如何创建一个数据库:
hive> create database financial;
如果数据库financial已经存在,将会抛出一个错误信息。使用下面的语句可以避免这种情况下抛出错误信息:
hive> create database financial if not exists financial;
可以通过下面语句来查看hive中包含的数据库:
hive> show databases; default financial
如果数据库很多,可以使用正则表达式来筛选需要的数据库名:
hive> show databases like 'f.*' financial
上面的例子用来显示以f开头的那些数据库名。
hive会为每个数据库创建一个目录。数据库中的表将会以这个数据库目录的子目录形式存储。唯一的例外是default数据库中的表,因为这个数据库本身没有自己的目录。
数据库所在目录位于属性"hive.metastore.warehouse.dir"所指定的为止。加入用户将这个属性的值设置为/user/hive/warehouse,那么当创建数据库financial时,hive将会对应的创建一个目录/user/hive/warehouse/financial.db。
请注意,数据库的文件目录名是以.db结尾的。
用户可以通过如下命令来修改这个默认的位置:
hive> create database financial location '/user/hive/mywarehouse';
用户也可以给这个数据库增加一个描述信息。语句如下:
hive> create databases financial comment 'Holds all financial tables';
可以通过如下语句来查看数据库的描述信息:
hive>describe database financial; financial Holds all financial tables hdfs://master-server/user/hive/warehouse/financial.db
可以通过下面语句来切换数据库:
hive> use financial; ... hive> use default; ...
可以删除数据库:
hive> drop database if exists financial;
默认情况下,hive不允许删除一个包含表的数据库,要么先删除数据库中所有的表,再删除数据库,要么在删除数据库的命令后面加上关键字cascade:
hive> drop database if exists financial cascade;
修改数据库:
用户可以使用alter database命令来为某个数据库的dbproperties设置键-值对属性值,来描述这个数据库的属性信息。但数据库的其他元数据都不可更改,包括数据库名和数据库所在目录位置:
hive> alter database financials set dbproperties('created by' = 'aaron')
创建表:
create table语句遵循sql语法惯例。例如:
create table if not exists financial.employee ( name string, age tinyint, salary float, subordinates array<string>, address struct<country:string,province:string,city:string,street:string> );
显示数据库中的表:
hive> use financial; hive> show tables; employee
即使不在financial数据库下,也可以列举该数据库下的表:
hive> use default; hive> show tables in financial; employee
同样的,也可以使用正则表达式过滤出所需要的表名:
hive> use financial; hive> show tables like 'emp.*'; employee
转载请注明出处:http://blog.csdn.net/iAm333