Hive使用注意事项

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值