一.将本地文件导入Hive案例
在本地创建一张student.txt
在Hive中创建一个student表
导入本地student.txt到student表
load data local inpath "/root/apps/hive-1.2.2/data/student.txt" into table student;
但是这样是有问题的——我们应该在创建表的时候指定分隔符。
我们把这张表删了重新创建一次,按正确方式导入。
二.Hive管理数据方式
Hive并不存储数据,甚至连元数据都不存储,而是管理存储在HDFS上的数据,通过Hive表导入数据只是简单地将数据移动(如果数据是在HDFS上)或复制(如果数据是在本地文件系统中)
1)内部表
内部表和关系型数据库中的表在概念上很类似,每个表在HDFS上都有相应的目录来存储表的数据,在创建表时,会在默认目录下生成一个以文件名前缀为名的目录,该目录下存储表。
比如先前创建的student表就是属于内部表:
在使用drop删除表的时候将会删除对应表的元数据和相应仓库目录下的数据。
2)外部表
外部表的数据不是存储在自己表所属的目录中,而是存储到别处,这样的好处是如果要删除这个外部表,外部表所指的数据时不会被删除的,他只会删除外部表对应的元数据
创建外部表时使用EXTERNAL关键字,告知Hive并不需要其管理外部表所操作的数据,该操作不会在数据仓库目录下自动创建以表名命名的目录,数据存储位置(HDFS下)由用户在创建表的时候使用LOCATION关键字来指定(该操作甚至不会检查用户指定的外部表是否存在)
3)内部表与外部表之间的抉择
如果所有在数据集上的处理都是使用Hive来完成,那么使用内部表;如果多用户之间共享同一数据集那么使用外部表
4)分区
在Hive中,表的每一个分区对应表目录下的一个子目录,所有分区的数据都是存储在对应的子目录中
5)桶
对指定的列值计算其hash,根据hash值切分数据,目的是为了并行,每个桶对应一个文件
三.Hive常用交互命令
我们还可以将结果(>)追加到文件中
四.Hive其他命令操作
1.退出Hive窗口
exit和quit
exit:隐形提交数据,再退出
quit:不提交数据退出
新版本Hive就没有这种区别了。
2.在Hive命令窗口查看hdfs文件系统和本地文件系统
dfs -ls /
3.查看Hive命令历史记录——默认是存储在/root下。
五.常见属性配置
/*
设置打印列名
*/
<property>
<name>hive.cli.print.header</name>
<value>true</value>
<description>Whether to print the names of the columns in query output.</description></property>
/*
设置打印当前db
*/
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
<description>Whether to include the current database in the Hive prompt.</description></property>
重新进入客户端:
是不是更好看了一些呢~
配置hive的日志存储位置:
我们还可以通过命令行的方式来一次性地修改参数:
六.Hive数据类型
1)基本数据类型
其中的STRING与关系型数据库中varchar类似,他可以存储2GB的字符数。
2)集合数据类型
create table test(
name string,
friends array<string>,
children map<string,int>,
address struct<street:string,city:string>
)
row format delimited
fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';
load data local inpath"/root/apps/hive-1.2.2/data/test.txt" into table test;
成功。