DDL(Hive Data Definition Language)(官网链接)
建库的就不多说了,跟关系型数据库差不多,这里主要说建表;
在hive中创建一张如下所示的表:
hive中的数据类型:前三个是复杂数据类型,后面的是基本数据类型,注意这里的字符串用的是String类型;
hive数据类型
其中中括号[]括起来的表示可选的;
既然知道了建表的语法,那么建如下表的sql语句要怎么写呢,表中有四个字段,分别是id,姓名,爱好,住址,
建表语句如下:
第一种:采用指定分隔符行匹配规则
指定分隔符
第二种:正则表达时行匹配规则;这种方式更加灵活,可以达到ETL(数据清洗),过滤掉不必要的符号;
比如如下格式数据:七个字段,字段之间用空格隔开;
数据
在hive客户端建表;
建表
加载数据;
加载数据
查询数据:
查询结果
另外两种建表的形式:
create table psn1 as select * from psn ; 表结构与数据全部创建和导入
create 。。。。like 仅仅拷贝表的架构,不包括数据
DML(Data Manipulation Language)
表建完了,接下来该向表中添加数据了;
hive中当然也可以采用insert 的方式向表中插入数据,但是显然使用这种方式效率是很低的;因此一般我们采用load的方式,语法如下:
load加载数据
注意:
local代表的是本地的文件,不指定的话默认是hdfs中的数据,load 加载hdfs中的数据是移动文件而不是复制文件(因为hdfs中的数据默认是3个副本,如果数据传输还是复制的话,那么hdfs的存储空间就会大打折扣);
filepath顾名思义,指的就是文件路径了;
hive中加载数据的时候随便一个文件,都不会失败,但是分隔不匹配的话,查询数据就会显示一行一行的NULL;
这是因为hive数据仓库跟关系型数据库还是有区别的:
关系型数据库是 写时检查,插入数据的时候格式不匹配就会报错;
hive数据仓库是 读时检查,所以任何文件都可以加载到表中;
load加载数据到hive表中的方式并不能适用于所有需求,当我们想要把一张表的字段拆分,插入到多张表时可以采用下面这种方式;
一个from关键字后面可以跟多个insert和select语句,理论上应该是一个select对应一个from,但是采用这种一个from方式可以节省数据访问的开销;
Hive中内部表跟外部表的区别
首先建表的时候语句不同,还是拿之前的数据,创建内部表如下;
创建内部表
创建外部表;指定external关键字,下面location指定hdfs文件路径;
创建外部表
总结:
(1):建表的语句不一样;
(2):内部表是先创建表在加载数据,外部表直接是加载hdfs中的数据,数据本来就放在hdfs中;
(3):删除表的时候,内部表关系型数据库中的元数据跟hdfs中的数据都会删除,外部表只删除关系型数据库的元数据,hdfs中的数据不删除;












网友评论