因为用mr对hdfs进行操作比较繁琐,所以才出现了hive。hive本质上进行操作的还是hdfs文件,而不是表。所以在一些地方,为了迎合hdfs文件,与sql语言有些许的不同。比如在建表方面的不同,在一些函数上的不同等。
一、hive 建表
1.1、直接建表法:
在建表时,要通过语法,将HDFS上的文件映射成表结构。所以在建表时与sql上有些许不同。
不过,建立好表以后,已经映射成表结构,那么操作就跟sql很相似了。
1.1.1、row format 与 file format
row format
其中,映射过程中会有参数row format(行的格式) 和 file format(文件的格式) 两个参数。
row format 表示的是行在存储时的序列化 与 反序列化 的规则。一般后面都是定好了默认参数的。需要的时候再改。
比如,给表定好了,列按照逗号分割,某个字段按照“-”分割,map型字段按照“:”分割。
这样订好了形式以后,就能够让系统比较合理的进行序列化与反序列化了
file format
表示hdfs文件存放的格式,默认是TEXTFILE,文本格式,可以直接打开。
按照参考的网页,建表。注意,建表的时候,已经指明了各个字段的类型,所以在进行分割的时候就很容易了。
create table t1(
id int
,name string
,hobby array<string>
,add map<String,string>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
;
元数据的概念:
参考:Hive的数据存储
元数据,是用来描述数据的数据。 表中的数据,比如,25,31是数据。而元数据中,元数据“年龄”就是用来描述25,31的。所以说,元数据是这种用来描述数据的数据。
在hive中
元数据是用来存储表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。 由于Hive的元数据需要不断的更新、修改,而HDFS系统中的文件是多读少改的,这显然不能将Hive的元数据存储在HDFS中。目前Hive将元数据存储在数据库中,如Mysql、Derby中。
1.1.2、external
未被external修饰的是内部表(managed table),被external修饰的为外部表(external table)
区别:
- 内部表数据由Hive自身管理,
外部表数据由HDFS管理; - 内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),
外部表数据的存储位置由自己制定; - 删除内部表会直接删除元数据(metadata)及存储数据;
删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除; - 对内部表的修改会将修改直接同步给元数据,
而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)
建立外部表(这里t2 被external所修饰了)
'''
create external table t2(
id int
,name string
,hobby array<string>
,add map<String,string>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
location '/user/t2'
;
'''
1.2、查询建表法:
将子查询的结果存在新表里,表中有数据。通过as查询语句完成建表。
例子:
create table t3 as
select
id
,name
from t2
;
1.3、like建表法
创建结构完全相同的表,但是没有数据。
例子:
create table t4 like t2;