Hadoop 之 Hive创建内外部表
Hive创建内外部表
Hive 数据库类似传统数据库,也是有数据库与表的概念,hive和关系数据库存储文件的系统不同,hive使用的是hadoop的HDFS(hadoop的分布式文件系统),关系数据库则是服务器本地的文件系统。Hive作用比如是为海量数据做数据仓库分析与挖掘之用等以及原理,可查看相关资料,这里通过操作层面的示例,认识下hive下如何创建与查询表,如何导入数据
Hive表分内部表与外部表,其区别体现在存储上,内部表的创建过程和数据加载过程可以分别独立完成,也可以在同一语句中完成,加载数据的过程中,实际数据会被移动到数据仓库目录中;之后对数据访问将会直接在数据仓库中完成。删除表时,表中的数据和元数据将会同时删除,而外外部表只有一个过程,加载数据和创建表同时完成,实际数据存储在 location指定的HDFS的相应目录,并不会移到数据仓库中,当删除外部表时,只是删除了该链接。
概括来讲,直观表现:
1.语句上看,创建外部表需要添加 external 字段
2.删除内部表时,表数据及HDFS中的数据文件都会被删除,删除外部表时,HDFS中的数据文件不会一起被删除,实际数据是存储在location指定的hdfs中目录。
一、创建内部表
首先是进入hive环境 >hive
hive> create table person (id int,name string,sex string,tel string) > row format delimited fields terminated by ',' > stored as textfile; OK Time taken: 0.187 seconds
查看创建是否成功
hive> show tables; OK person Time taken: 0.11 seconds, Fetched: 1 row(s) hive>
准备好待导入表的数据,如
加载数据,我们可以提前准备好文件,如/usr/mydata/persion.txt 内容为
1 zhangshan man 13000000001
2 lishi woman 15000000001
3 wangwu man 17000000001
4 sytemadm man 10000000001
将上面文本文件中的内容导入刚才建的person表中
hive> load data local inpath '/usr/mydata/person.txt' into table person; Loading data to table default.person OK Time taken: 9.869 seconds
查看数据
hive> select * from person; OK 1 zhangshan man 13000000001 2 lishi woman 15000000001 3 wangwu man 17000000001 4 sytemadm man 10000000001 Time taken: 2.266 seconds, Fetched: 4 row(s) hive>
查看表存储目录,hive.metastore.warehouse.dir是在HIVE_HOME/conf/hive-site.xml中配置的,路径默认为/user/hive/warehouse,查看此目录可看到一个目录名为person
[hadoop@kencentos01 bin]$ hdfs dfs -ls /user/hive/warehouse Found 1 items drwxrwxrwx - hadoop supergroup 0 2017-12-26 14:53 /user/hive/warehouse/person
person下有个文件就是我们在导入数据时,从本地文件导入HDFS中的person.txt文件
[hadoop@kencentos01 bin]$ hdfs dfs -ls /user/hive/warehouse/person Found 1 items -rwxrwxrwx 3 hadoop supergroup 106 2017-12-26 14:53 /user/hive/warehouse/person/person.txt
二、创建外部表
创建外部表,注意关键字”external”,location是指定表的文件位置,若不指定,则为默认与上面内部表一样配置的路径
hive> create external table person_external (id int,name string,sex string,tel string) > row format delimited fields terminated by ',' > stored as textfile > location '/user/hive/warehouse/external'; OK Time taken: 1.31 seconds
查看建表结果
hive> show tables; OK person person_external Time taken: 0.124 seconds, Fetched: 2 row(s) hive>
同样为了导入数据,需提前准备相应文件如,person_external.txt ,具体内容按字段类型列出就行,可直接拿上面内部表数据
hive> load data local inpath '/usr/mydata/person_external.txt' into table person_external; Loading data to table default.person_external OK Time taken: 0.673 seconds
查看数据,与查看内部表一样:
查看表中的数据 hive> select * from person_external > ; OK 11 zhangshan man 13000000002 12 lishai woman 15000000002 13 wangwu man 17000000002 14 systemadm man 10000000002 Time taken: 1.004 seconds, Fetched: 4 row(s)
查看文件所在位置,对应的HDFS目录
[hadoop@kencentos01 bin]$ hdfs dfs -ls /user/hive/warehouse/external Found 1 items -rwxrwxrwx 3 hadoop supergroup 112 2017-12-26 15:22 /user/hive/warehouse/external/person_external.txt