一、Hive的安装与启动
Hive的运行环境需要Jdk1.6、Hadoop0.17及以上版本,在这里我下载了hive-0.6.0.tar.gz。解压到/usr/local/hive,在环境变量中
首先,启动Hadoop,到HADOOP_HOME/bin下,执行start-all.sh,然后在命令行中输入hive,回车,就进入了Hive的执行界面:
二、HQL
create table 语句
第一行声明了一个名为user的一张表,该表包括两个字段id和name,分别为int和string类型。剩下的两行表示在存储user的数据的文件中每一行应该有三个字段,字段用tab键隔开,每行用回车隔开。
Load Data语句
将数据加载到user表中
通过上面的命令告诉Hive将sample.txt移动到hive的仓库目录(默认为/user/hive/warehouse)下面,在这个过程中不涉及到文件的解析,hive也不会按照特殊的格式来存储sample.txt。我们可以通过命令来浏览HDFS目录
select 语句
HQL的select操作和SQL非常相似,但是也有一些细微差别,这在以后会慢慢地讲到的
三、partitions and buckets
hive可以通过partitions将表粗粒度划分为不同的目录来提高查询的效率,例如包含时间戳的日志文件,如果我们按照时间来把日志文件分在不同的目录下,那么相同日期的记录就会存储在同一个分区目录下面,那我们就可以更高效率地查询特定某个时间的记录了。例如:
通过partitioned by声明的字段表面上和在普通的column没什么不一样的。如下所示:
不同之处在于,表并不存储通过partitioned by声明的字段,而是将不同字段的数据放在partitioned字段目录下面,通过路径来获得partitioned字段的值。所以在我们想partitioned 表中加载数据时,需要指明partitioned 字段的值,例如:
我们可以查看一个table的partitioned 情况:
为了是查询效率更高以及采样数据更方便,在Hive中引入了bucket的概念,首先来看一下如何产生一个bucketed的table。
首先需要将Hive的hive.enforce.bucketing属性设置为ture,然后加载数据:
下面我们来看一下bucketed_user 下的数据文件结构,包含了四个部分。
我们随便查看一个文件
可以看到id为1和5的记录被放进了同一个文件中,主要是应为我们设置了bucketed的参数为4,hive会按照id的hash值对4取模来确定存储的bucketed。