数据库(Databases)
数据库是表的集合,在HDFS中体现为一个同数据库名的文件夹,例如mydemo.db文件夹,默认存放在hive.metastore.warehouse.dir指向的数据仓库地址中(在hive-site.xml中指定,是HDFS文件夹)。
hive-site.xml文件中:
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/usr/hive/warehouse</value>
</property>
HDFS查看文件夹。
如何知道当前工作在哪个数据库?
hive > select current_database(); //查询显示当前数据库
hive > set hive.cli.print.current.db = true; //设定显示当前数据库名
Hive数据类型
原始数据类型
类型 | 示例 |
TINYINT | 10Y |
SMALLINT | 10S |
INT | 10 |
BIGINT | 100L |
FLOAT | 1.342 |
DOUBLE | 1.234 |
DECIMAL | 3.14 |
BINARY | 1010 |
BOOLEAN | TRUE |
STRING | 'Books’or"Books" |
CAHR | 'YES’or"YES" |
VARCHAR | 'Books’or"Books" |
DATE | ‘2020-05-29’ |
TIMESTAMP | ‘2020-06-02 23:34:00.123’ |
复杂数据类型
类型 | 格式 | 定义 | 示例 |
Array | [‘Apple’,‘Orange’] | Array<string> | a[0] = ‘Apple’ |
Map | {‘A’:‘Apple’,‘O’:‘Orange’} | Map<string,string> | b[‘A’] = ‘Apple’ |
Struct | {‘Apple’,2} | Struct<fruit:stgring,weight:int> | c.weight = 2 |
array:存储相同数据类型的数据
map:具有相同类型的键值对
struct:封装一组字段
数据表(Tables)
分类:内部表、外部表
两者区别:
内部表:managed table
- 表中数据由Hive自身管理 在删除表(元数据)的同时也会删除数据
- 数据存储位置:数据库对应HDFS文件中(若使用default数据库,则直接存放在/user/hive/warehouse中)
- 适用情景:不需要共享数据的情景(存储数据统计分析的结果数据)
外部表:external table
- 表中数据由HDFS管理 删除表(元数据)的时候,数据不会删除
- 数据存储位置:自定义(location),(若无location,则在数据库对应HDFS的文件夹下建立一个与表同名的子文件夹,数据存放在此)
- 适用情景:数据共享的情景(存储数据统计时的源数据)
元数据(metastore)
- 元数据包括:表名、表所属的数据库(默认是 default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;
- 默认存储在自带的 derby 数据库中,推荐使用 MySQL 存储 Metastore,可以在安装的时候,进行相应配置,以使用 MySQL 存储元数据。
Hive 元数据结构
数据结构 | 描述 | 逻辑关系 | HDFS物理存储 |
Database | 数据库 | 集合 | 文件夹 |
Table | 表 | 行数据的集合 | 文件夹 |
Partition | 分区 | 用于分割数据 | 文件夹 |
Buckets | 分桶 | 用于分布数据 | 文件 |
Row | 行 | 行记录 | 文件中的行 |
Columns | 列 | 列记录 | 每行中指定的位置 |
Views | 视图 | 逻辑概念,可跨越多张表 | 不存储数据 |
Index | 索引 | 记录统计数据信息 | 文件夹 |
Hive创建表
建表语句规则如下:
字段说明:
(1)CREATE TABLE:创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
(2)EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据
仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删
除元数据,不删除数据。
(3)COMMENT:为表和列添加注释。
(4)PARTITIONED BY:创建分区表
(5)CLUSTERED BY:创建分桶表
(6)SORTED BY:不常用
(7)ROW FORMAT DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char] [MAP KEYS TERMINATED BY char]
[LINES TERMINATED BY char]| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value,
property_name=property_value, ...)]
用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。
在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive 通过 SerDe 确定表的具体的列的数据。
(8)STORED AS 指定存储文件类型常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)
如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,可以使用 STORED AS SEQUENCEFILE。
(9)LOCATION :指定表在 HDFS 上的存储位置。
(10)LIKE 允许用户复制现有的表结构,但是不复制数据。
创建内部表(管理表)
create table studentinfo1(
sid int,
sname string,
age int)
row format delimited fields terminated by ','
stored as textfile;
创建外部表 external修饰
create external table student1(
sid int,
sname string,
class_id int )
row format delimited fields terminated by ','
location '/testdata';
show tables 可以在数据库中查看到两个表已成功创建。
这时查看HDFS文件(刷新),内部表studentinfo1对应在/usr/hive/warehouse/mydemo.db中,是一个文件夹,外部表student1即/testdata文件夹。
查看表结构
desc formatted table_name
desc formatted sutdentinfo1 内部表(管理表)
表类型managed 存储路径location(建表时未指定)默认数据库文件下自动创建同表名文件夹。
desc formatted sutdent1 外部表
表类型external,存储路径location自定义路径/testdata
表数据填充(内外表皆可) 以内部表studentinfo1举例
1.增量方式 insert into 每一次增加都在表已有数据后新增记录,原有数据不变。
hive (mydemo)> insert into studentinfo1 values(1,'cm',15),(2,'dd',16),(3,'dai',15);
hive (mydemo)> select * from studentinfo1;
OK
1 cm 15
2 dd 16
3 dai 15
2.全量方式 insert overwrite 以新增数据覆盖表中原有数据,改变表原有数据。
hive (mydemo)> insert overwrite table studentinfo1 values(4,'wang',20);
hive (mydemo)> select * from studentinfo1;
OK
4 wang 20
增量和全量方式向表中增加数据,数据对应在HDFS文件中的一个文件000000_0。
3.装载 load data
load data [local] inpath file [insert/overwrite] into table table_name
选用local,则使用虚拟机中的本地文件
举例:将linux中/opt/student1.csv文件覆盖到studentinfo1表中
hive (mydemo)> !cat /opt/student1.csv;//加!使用linux中的命令
hive (mydemo)> load data local inpath '/opt/student1.csv' overwrite into table studentinfo1;
hive (mydemo)> select * from studentinfo1;
使用load装载文件数据到表中时,表数据对应HDFS文件中是装载文件的形式student1.csv。
4.文件数据上传到HDFS文件中
truncate table studentinfo1;//清空表数据(千万不要在工作中轻易使用!!!)这时候查看HDFS文件中studentinfo1文件中已没有数据文件。查询表为空。
hive (mydemo)> truncate table studentinfo1;
hive (mydemo)> select * from studentinfo1;
hive (mydemo)> !hdfs dfs -put /opt/student1.csv /usr/hive/warehouse/mydemo.db/studentinfo1;//数据文件上传到HDFS中表数据的存储位置中
hive (mydemo)> select * from studentinfo1;//表中有数据
删除表(元数据)
删除内、外表(内外表都先给一些数据)
drop table table_name
内、外表的结构(元数据)已被删除,表已经不存在了。
查看各表的HDFS数据文件,内部表数据文件已删除,外部表数据还存在。