一、环境描述
1、Hadoop版本0.20.2,操作系统Linux、JDK 1.6
2、Hive版本0.5.0
二、元数据的存储
1、如果之前进行了建表操作,但是后来对hdfs format后,通过Hive的cli来输入指令show tables查看表,表结构依然存在,但是hdfs文件系统中对应的目录却不存在。那是因为hive的元数据还存在原因导致。元数据默认存放在metastore_db中,删除这个文件夹,再使用show tables命令来查看,表结构自然不存在。由此可以看出metastore_db就是Hive默认存储元数据的地方。
2、对于Hive元数据的存储,默认采用derby。
3、一共有三种元数据的存储方式:
Single User Mode: 此模式连接到一个 In-memory 的数据库 Derby,一般用于 Unit Test。
Multi User Mode:通过网络连接到一个数据库中,是最经常使用到的模式。
Remote Server Mode:用于非 Java 客户端访问元数据库,在服务器端启动一个 MetaStoreServer,客户端利用 Thrift 协议通过MetaStoreServer 访问元数据。
三、Hive Web Interface的启动
1、安装完成Hive 0.5.0之后,如果想使用web操作,可以使用hwi。
2、控制台执行:hive --service hwi > /dev/null 2> /dev/null &
3、web输入http://IP地址:9999/hwi/
4、如果想修改端口和制定的hwi的war包,可以修改一下配置项:
<property> <name>hive.hwi.war.file</name> <value>lib/hive-hwi-0.5.0.war</value> <description>This sets the path to the HWI war file, relative to ${HIVE_HOME}. </description> </property> <property> <name>hive.hwi.listen.port</name> <value>9999</value> <description>This is the port the Hive Web Interface will listen on</description> </property>
四、Hive查询
1、创建表检查表创建和输入的数据文件是否对应,可以通过做查询来检查。例如:如果建了一张表叫user_info,里面含有3个字段,以/t划分,一行一条数据,脚本如下:CREATE TABLE USER_INFO( ACC STRING, PWD STRING, AGE STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '/t' LINES TERMINATED BY '/n' STORED AS TEXTFILE;输入数据文件格式如下:
dajuezhao 123456 1 huaguniang 654321 0 supermen 78908 0实例分析:
A、如果输入文有4个字段,但建表却只定义了3个字段,这个时候,如果使用“select * from user_info limit 1”将只会显示前3个字段值。
B、反之,如果建表4个字段,输入文本只有3个字段,那么使用“select * from user_info limit 1”时最后一个字段显示为NULL。
C、如果建表的字段定义类型和文本文件的字段值类型不符合,那么即使是字段的数量对应,使用查询语句,在错误字段也将返回NULL。
总结:
如果在执行“select * from user_info limit 1”之后后控制台显示最后的字段为NULL,至少说明表字段数量多于文本的字段数量或者是最后一个字段的类型对应不上。如果是中间字段出现NULL,说明是字段类型对应不上。(但是如果字段是数字类型,且该字段为空,那么在select的时候返回的也是NULL。这个是需要注意的)
2、如果想把查询的结果集合出到本地,可采用以下格式:
INSERT OVERWRITE LOCAL DIRECTORY '/jz/hive/result' select * from user_info limit 1;
需要注意的是,指定的目录必须是上一级存在的,如上例:/jz/hive是必须存在(hive不会自动创建该目录),result目录会自动创建。
如果result目录下有内容,将会覆盖。
3、如果是返回多个字段结果,可采用以下方式查看:
INSERT OVERWRITE LOCAL DIRECTORY '/jz/hive/result' select acc,pwd from user_info limit 1;
查看结果文件,内容的分割符号为“/001”,输入命令查看“awk -F '/001' '{print $1, $2}' attempt_200806210422_0011_r_000000_0”