1)注意表中的数据是存储在hdfs中的,但是表的名称、字段信息是存储在metastore中的
2)中文乱码问题:
中文乱码的原因是因为hive数据库里面的表都是latin1编码的,中文本来就会显示乱码,但是又不能修改整个数据库里面所有表的编码,否则在使用hive的时候会出问题,那么只有考虑把存储字段注释和表注释相关的表的编码改为utf8。
alter table COLUMNS_V2 modify column COMMENT varchar(256) character set 'utf-8';
3)hive在创建表的时候,需要我们指定相应的行分隔符,列分隔符
而我们在创建mysql表的时候,这些都是不需要的,因为它在组织数据的时候,已经规定好了数据的表现形式。
我们刚才在创建t3的时候没有指定相应的分隔符,所以导致使用制表符分割的数据无法被解析。
hive是有默认的分隔符的,默认的行分隔符是 '\n' ,就是换行符
而默认的列分隔符呢,是\001 。
\001 这个是ASCII码中的特殊不常使用的不可见字符,在文本中我们可以通过 ctrl+v 和 ctrl+a 来输入\001 ,这里我们在将 t3.data 改一下,重新上传,再查看表t3。
修改hive表的默认分隔符:
create table t3_new(
id int comment 'ID',
stu_name string comment 'name',
stu_birthday date comment 'birthday',
online boolean comment 'is online'
)row format delimited
fields terminated by '\t'
lines terminated by '\n';
需要注意的是, lines terminated by 行分隔符可以忽略不写,但是如果要写的话,只能写到最后
面!
Hive数据类型:
基本数据类型
一般数字类型我们可以试验int,小数可以使用double,日期可以使用date类型、还有就是boolean类型,这些算是比较常见的了,前面我们在建表的时候基本都用过了。
这些基本数据类型倒没有什么特殊之处
数据类型 开始支持版本 数据类型 开始支持版本
TINYINT ~ TIMESTAMP 0.8.0
SMALLINT ~ DATE 0.12.0
INT/INTEGER ~ STRING ~
BIGINT ~ VARCHAR 0.12.0
FLOAT ~ CHAR 0.13.0
DOUBLE ~ BOOLEAN ~
DECIMAL 0.11.0
复合数据类型
数据类型 开始支持版本 格式
ARRAY 0.14.0 ARRAY<data_type>
MAP 0.14.0 MAP<primitive_type, data_type>
STRUCT ~ STRUCT<col_name : data_type, ...>
Array
先来看Array,这个表示是一个数组结构
数据:more stu.data
1 zhangsan swing,sing,coding
2 lisi music,football
来建一张表,指定了一个array数组类型的字段叫favors,数组中存储字符串,数组中的元素怎么分割呢?通过 collection items terminated by ',' 指定的
create table stu(
id int,
name string,
favors array<string>
)row format delimited
fields terminated by '\t'
collection items terminated by ','
lines terminated by '\n';
插入数据:
load data local inpath '/data/soft/hivedata/stu.data' into table stu;
角标是从0开始的,如果获取到了不存在的角标则返回null
Map
下面来说一下另外一种常见的集合——map,我们知道map集合里面存储的是键值对,每一个键值对属于Map集合的一个item,
数据:
more stu2.data
1 zhangsan chinese:80,math:90,english:100
2 lisi chinese:89,english:70,math:88
创建表:
create table stu2(
id int,
name string,
scores map<string,int>
)row format delimited
fields terminated by '\t'
collection items terminated by ','
map keys terminated by ':'
lines terminated by '\n';
向表中插入数据:
load data local inpath '/data/soft/hivedata/stu2.data' into table stu2;
查询成绩:
select id,name,scores['chinese'],scores['math'] from stu2;
Struct
再来介绍最后一种复合类型struct,有点像java中的对象
某学校有2个实习生,zhangsan、lisi,每个实习生都有地址信息,一个是户籍地所在的城市,一个是公司所在的城市,
数据:
more stu3.data
1 zhangsan bj,sh
2 lisi gz,sz
建表:
create table stu3(
id int,
name string,
address struct<home_addr:string,office_addr:string>
)row format delimited
fields terminated by '\t'
collection items terminated by ','
lines terminated by '\n';
Struct和Map的区别
如果从建表语句上来分析,其实这个Struct和Map还是有一些相似之处的
来总结一下:
1)map中可以随意增加k-v对的个数
struct中的k-v个数是固定的
2)map在建表语句中需要指定k-v的类型
struct在建表语句中需要指定好所有的属性名称和类型
3)map中通过[]取值
struct中通过.取值,类似java中的对象属性引用
4)map的源数据中需要带有k-v
struct的源数据中只需要有v即可
总体而言还是map比较灵活,但是会额外占用磁盘空间,因为他比struct多存储了数据的key
struct只需要存储value,比较节省空间,但是灵活性有限,后期无法动态增加k-v