Hive的数据类型解析和表的操作实例

另外一篇关于Hive的表,外部表,分区,桶的理解的博客:点击阅读

本文所需要的HIveQL源码和所需的测试用例github地址为:点击查看

一:Hive中的数据类型

Hive支持两种数据类型,一类叫原子数据类型,一类叫复杂数据类型。

  原子数据类型包括数值型、布尔型和字符串类型,具体如下表所示:

基本数据类型

类型

描述

示例

TINYINT

1个字节(8位)有符号整数

1

SMALLINT

2字节(16位)有符号整数

1

INT

4字节(32位)有符号整数

1

BIGINT

8字节(64位)有符号整数

1

FLOAT

4字节(32位)单精度浮点数

1.0

DOUBLE

8字节(64位)双精度浮点数

1.0

BOOLEAN

true/false

true

STRING

字符串

‘xia’,”xia”

        上表我们看到hive不支持日期类型,在hive里日期都是用字符串来表示的,而常用的日期格式转化操作则是通过自定义函数进行操作。

        hive是用java开发的,hive里的基本数据类型和java的基本数据类型也是一一对应的,除了string类型。有符号的整数类型:TINYINT、SMALLINT、INT和BIGINT分别等价于java的byte、short、int和long原子类型,它们分别为1字节、2字节、4字节和8字节有符号整数。Hive的浮点数据类型FLOAT和DOUBLE,对应于java的基本类型float和double类型。而hive的BOOLEAN类型相当于java的基本数据类型boolean。

  对于hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以存储2GB的字符数。

  Hive支持基本类型的转换,低字节的基本类型可以转化为高字节的类型,例如TINYINT、SMALLINT、INT可以转化为FLOAT,而所有的整数类型、FLOAT以及STRING类型可以转化为DOUBLE类型,这些转化可以从java语言的类型转化考虑,因为hive就是用java编写的。当然也支持高字节类型转化为低字节类型,这就需要使用hive的自定义函数CAST了。

      

        复杂数据类型包括数组(ARRAY)、映射(MAP)和结构体(STRUCT),具体如下表所示:

 复杂数据类型

类型

描述

示例

ARRAY

一组有序字段。字段的类型必须相同

Array(1,2)

MAP

一组无序的键/值对。键的类型必须是原子的,值可以是任何类型,同一个映射的键的类型必须相同,值得类型也必须相同

Map(‘a’,1,’b’,2)

STRUCT

一组命名的字段。字段类型可以不同

Struct(‘a’,1,1,0)

二:创建表操作实例

1:创建内部表student表

create table student(
id int,
name string,
age int)
comment 'this is student message table'
row format delimited fields terminated by '\t';

student.txt数据内容如下:

1    WEEW    23
2    QVCD    32
3    sdfw    43
4    rfwe    12

加载数据(从本地加载数据):

<span style="font-size:14px;">load data local inpath '/home/thinkgamer/MyCode/hive/student.txt' into table student;</span>

当然我们也可以从HDFS加载:

load data inpath '/file/student.txt' into table student;

查看结果如下:


2:创建外部表external_student

comment 是注释说明,row... by "\t" 是指定行分隔符,这样在加载数据时只需保证源文件行的每个字段是以\t分割即可

#创建外部表
create external table external_student(
id int,
name string,
age int)
comment 'this is student message table'
row format delimited fields terminated by '\t'
location "/user/hive/external";
加载数据(数据文件内容和上边的student一样)

hdfs dfs -put /home/thinkgamer/MyCode/hive/external_student /user/hive/external
这种加载方式常常用于当hdfs上有一些历史数据,而我们需要在这些数据上做一些hive的操作时使用。这种方式避免了数据拷贝开销

3:创建表copy_student,并从student表中导入数据

#创建copy_student表,并从student表中导入数据
create table copy_student(
id int,
name string,
age int)
comment 'this is student message table'
row format delimited fields terminated by '\t';
导入数据:

from student stu insert overwrite table copy_student select *;

过程如图:


4:创建复杂类型的表complex_student

COLLECTION ITEMS TERMINATED BY 指定的是列之间的分隔符

MAP KEYS TERMINATED BY 指的是MAP key value之间的分隔符

#创建复杂类型的表
Create table complex_student(stu_mess ARRAY<STRING>,
stu_score MAP<STRING,INT>,
stu_friend STRUCT<a:STRING,b :STRING,c:STRING>)
comment 'this is complex_student message table'
row format delimited fields terminated by '\t'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':';

加载数据:

load data local inpath "/home/thinkgamer/MyCode/hive/complex_student" into table complex_student;

comlex_student数据格式如下:

thinkgamer,23,thinkgamer@163.com    chinese:50,math:49,english:50    cyan,qiao,gao   

进行查询:


5:创建分区表

create table partition_student(
id int,
name string,
age int)
comment 'this is student message table'
Partitioned by (grade string,class string)
row format delimited fields terminated by "\t";

数据源如下

partition_student

1    WEEW    23
2    QVCD    32
3    sdfw    43
4    rfwe    12

partition_student2

5    hack    43
6    spring    54
7    cyan    23
8    thinkgamer    43

加载数据:


Loading data local inpath 'path' into table partition_student partition (grade=2013, class=34010301)
Loading data local inpath 'path' into table partition_student partition (grade=2013, class=34010302)

查看分区:


全部查询结果如下:

指定分区查询:

select * from partition_student where class=34010301;

so ,问题来了,hive1.1.1对于where的支持是个盲区,bug,每次执行where就会报错,所以这里小编就不过多解释,感兴趣的朋友可以自己百度


6:创建桶

创建临时表student_tmp:

create table student_tmp(
id int,
name string,
age int)
comment 'this is student message table'
row format delimited fields terminated by '\t';
load数据:

load data local inpath '/home/thinkgamer/MyCode/hive/student.txt' into table student_tmp;

创建指定桶的个数的表student_bucket:


create table student_bucket(id int,
name string,
age int)
clustered by(id) sorted by(age) into 2 buckets
row format delimited fields terminated by '\t';

设置环境变量:
set hive.enforce.bucketing = true;

从student_tmp 装入数据

from student_tmp
insert overwrite table student_bucket
select *;

HDFS查看如下:


物理上,每个桶就是表(或分区)目录里的一个文件,桶文件是按指定字段值进行hash,然后除以桶的个数例如上面例子2,最后去结果余数,因为整数的hash值就是整数本身,上面例子里,字段hash后的值还是字段本身,所以2的余数只有两个0和1,所以我们看到产生文件的后缀是*0_0和*1_0,文件里存储对应计算出来的元数据。

  Hive的桶,我个人认为没有特别的场景或者是特别的查询,我们可以没有必要使用,也就是不用开启hive的桶的配置。因为桶运用的场景有限,一个是做map连接的运算,我在后面的文章里会讲到,一个就是取样操作了,下面还是引用风生水起博文里的例子:

查看sampling数据:


tablesample是抽样语句,语法:TABLESAMPLE(BUCKET xOUTOFy)
y必须是table总bucket数的倍数或者因子。hive根据y的大小,决定抽样的比例。例如,table总共分了64份,当y=32时,抽取 (64/32=)2个bucket的数据,当y=128时,抽取(64/128=)1/2个bucket的数据。x表示从哪个bucket开始抽取。例 如,table总bucket数为32,tablesample(bucket 3outof16),表示总共抽取(32/16=)2个bucket的数据,分别为第3个bucket和第(3+16=)19个bucket的数据。


三:修改表操作实例

1:hive表重命名

alter table movie_links rename to links;

2:删除列

      目前的links表有两列

hive> desc formatted links;
OK
# col_name              data_type               comment             
                 
id                      int                                         
href                    string                                      
    删除id列

 alter table links replace columns(href string);
    再查看

hive>desc formatted links;
OK
# col_name              data_type               comment             
                 
href                    string                                      

3:清空表

   truncate table links;

4:添加列

  alter table test add columns(age int);


5:insert语句

     关于insert语句,可以用来在别的表查询结果插入hive 表,也可以通过insert将结果保存在hdfs上

     具体可参考:http://blog.csdn.net/yeruby/article/details/23039009

     插入一条记录:

 create table test(id int,name string);
 insert into table test(id,name) values(1,"sdfs");
      查看:

hive> select * from test;
OK
1       sdfs
Time taken: 0.242 seconds, Fetched: 1 row(s)
      插入多条数据

insert into table test(id,name) values(2,"aaa"),(1,"bbb"),(3,"ccc");
      查看
hive> select * from test;
OK
1       sdfs
2       aaa
1       bbb
3       ccc
Time taken: 0.215 seconds, Fetched: 4 row(s)



四:Hive不支持的函数(持续更新)

       1:hive不支持delete和update函数

       HIVE是一个数据仓库系统,这就意味着它可以不支持普通数据库的CRUD操作。CRUD应该在导入HIVE数据仓库前完成。而且鉴于 hdfs 的特点,其并不能高效的支持流式访问,访问都是以遍历整个文件块的方式。hive 0.7 之后已经支持索引,但是很弱,尚没有成熟的线上方案。

       倒是可以想尽办法来进行替换,比如说delete,我们可以进行查询,将不需要删除的数据集插入的table中,eg

       我们的test表

hive> select * from test;
OK
1       aa      12
2       bb      23
Time taken: 0.207 seconds, Fetched: 2 row(s)
         现在要删除id=1这条记录

insert overwrite table test select test.* from test where id!=1;
         再次查看表

hive> select * from test;
OK
2       bb      23
Time taken: 0.213 seconds, Fetched: 1 row(s
        当然这并不是高效的办法


 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库方案设计 云数据库的云化改造 面向云化环境,数据库在多个方面需要进行改造,包括快捷的安装部署,提供数据 库的动态伸缩和资源隔离,以及监控、迁移、备份等一体化管理,以适应云环境中自动 安装部署、一体化监控管理,资源动态分配等需求。 快速安装及部署 1.1 一键部署和分钟级实例的创建: 1. 准备好预置数据库的docker镜像 a. 初始化好空数据目录(也支持根据场景预置数据) b. 数据库配置文件放置在docker镜像之外,通过映射的方式进入镜像内部 2. 用户选择实例资源后(CPU、内存),系统自动计算最佳设置 a. 用户选择实例的内存、CPU数量,使用场景(OLTP、OLAP) b. 根据用户选择,自动调整、优化参数(共享缓存、work_mem、等等) 3. 使用docker镜像加载外置配置文件启动数据 1.2 多种部署方式 1. 单机(单独的docker镜像) 2. 主备 和 负载均衡 a). 配置好的三个独立docker镜像,分别扮演主机、备机、读写分离节点 b). 三个节点配置文件都在外部,映射到内部运行 c). 启动时,根据用户的资源选择和网络场景,自动规划配置文件内容 3. KADB 集群 a). 根据角色配置好独立的docker镜像,分别扮演数据节点、协调器节点等 b). 节点的配置文件都放在外部,映射到内部运行 c). 根据用户设置的资源,场景,自动分配节点数量,配置节点参数. 在线伸缩 云环境中,支持在线调整任何一个实例使用的资源。对于数据库而言,若分配的资 源,包括CPU、内存、磁盘等资源发生变化,数据库同样需要对于资源的变化实施生效。 CPU变化时,主要影响数据库的并发连接数和并行参数,在金仓云数据库中,并发连 接数和并行参数可以动态调整。 内存发生变化时,数据库的共享内存,排序内存等内存分配支持动态调整,动态扩 展。 磁盘发生变化时,数据库可以配置空间的存储,以及存储,分区的存储,动态 使用新增资源。 另外,随着实际业务的增长,数据库集群的负载可能超出初始设计的承受能力,使 得处理能力下降,不再满足业务需求,所以数据库集群支持在线扩展能力,即在不影响 系统正常使用的情况下,增加数据库的数据处理能力。 资源隔离 KingbaseES云数据库支持多租户模式,以实现多个租户之间的资源隔离。 每个租户创建自己的数据库,各自的数据库从元信息、用户数据到内存、以及日志 信息,都是彼此隔离的。每个租户的数据库不可以彼此访问。 各个租户的数据库可以方便的迁移和加载,支持各自的备份和恢复。 一体化管理 使用 KEM 监控数据库运行状态 a). 支持自主监控(由KEM主动呈现) b). 支持将收集的数据汇集到其他管理平台 使用 WEB 对象管理工具管理数据库对象 a). 单机形式的数据库对象管理 b). 主备形式的数据库对象管理 c). KADB集群数据库对象管理 二、向非关系型存储、大数据处理进行扩展 通用数据库 通用数据库按照处理业务的类型,分为交易型数据库和分析型数据库。 1. 交易数据库 主要用于交易类型的业务处理,例如:业务流程电子化,其他业务系统。面向所有 参与业务流程的人员。对数据操作特点是:大量短、频、快的增删改操作。 2. 分析型数据库 主要用于统计分析,数据挖掘应用。面向决策者和分析人员。对数据库的操作特点 是:大量数据入库,大量复杂查询。 云上的数据库需要有这两种数据库,来应对更多的用户应用需求。 与大数据平台的互访 大数据计算平台,例如Spark、HIVE等,需要支持大数据计算平台与数据库互访。以 大数据计算平台为中心,建立分析平台。 1. 大数据计算平台访问数据库 a)大数据计算平台Spark: 可以提供JdbcRDD来访问单机数据库系统,并且根据某列对进行分区,并行读取, 提升效率。对于集群数据库,Spark工作进程可以对每一个存储节点进行数据读取,通过 这种并行的方式提升效率。 b)大数据计算平台HIVE: 需要在HIVE中注册数据信息,将数据库的映射成HIVE,通过Hive- SQL进行数据读取,并在HIVE中进行运算。 2. 数据库访问大数据计算平台 大数据计算平台可以将数据,例如计算结果,写入到数据库中,再在数据库中, 利用SQL对数据进行分析。 云数据集成 3.1 与RDS的数据集成 数据库使用外部技术,可以访问RDS中的其他数据。 支持多种格式的数据; 支持访问和更新数据。 同时,使用迁移工具实现到RDS的数据集成。 3.2.与大数据存储平台的数据集成 数据库提供外部技术,可以将交易型和分析型数据库与其他存储平台对接,在数 据库内部,通过外部访问大数据存储平台中的数据,包括: a)与HDFS对接:外部访问引擎(读写模块),通过调用HDFS的访问接口(

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值