首页 > 代码库 > Hive编程指南学习笔记(1)

Hive编程指南学习笔记(1)

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

Hive编程指南学习笔记(1)