第一章 Hive数据类型
1 Hive数据类型
本篇文章介绍Hive不同的数据类型, 用于创建表. Hive所有的数据类型分为四种类型, 给出如下.
- 列类型
- 文字
- Null 值
- 复杂类型
1.1 列类型
列类型被用作Hive的列数据类型. 它们如下:
整型
整形数据可以指定使用整型数据类型, INT
. 当数据范围超过INT
的范围时, 需要使用BIGINT
, 如果数据范围比INT
小, 使用SMALLINT
. TINYINT
比SMALLINT
小.
下表描述了各类INT数据类型.
类型 | 后缀 | 示例 |
---|---|---|
TINYINT | Y | 10Y |
SMALLINT | S | 10S |
INT | - | 10 |
BIGINT | B | 10L |
字符串类型
字符串类型的数据类型可以使用单引号或双引号来指定. 它包含两个数据类型, VARCHAR
和CHAR
. Hive遵循C-类型的转义字符.
下表描述了各类CHAR
数据类型:
数据类型 | 长度 |
---|---|
VARCHAR | 1-65355 |
CHAR | 255 |
时间戳
它支持传统的UNIX时间戳可选纳秒的精度. 它支持java.sql.Timestamp格式YYYY-MM-DD HH:MM:SS.fffffffff
和格式YYYY-MM-DD HH:MM:ss.fffffffff
日期
DATE值在年/月/日的格式形式描述.
小数点
在Hive小数类型与Java大十进制格式相同. 它可以同于表示不可改变的任意精度. 语法和示例如下:
DECIMAL(precision, scale)
decimal(10, 0)
联合类型
联合类型和异类的数据类型的集合. 它可以使用联合创建的一个实例. 语法和示例如下:
UNIONTYPE<int, double, array<string>, struct<a:int, b:string>>
{0:1}
{1:2.0}
{2:["three", "four"]}
{3:{"a":5, "b":"five"}}
{2:["six", "seven"]}
{3:{"a":8, "b": "eight"}}
{0: 9}
{1: 10.0}
1.2 文字
下面是Hive中使用的文字数据类型
浮点类型
浮点类型是只不过有小数点的数字. 通常, 这种类型的数据组成DOUBLE
数据类型.
十进制类型
十进制数据类型是只不过浮点值范围比DOUBLE
数据类型更大. 十进制类型的范围大约是
−
1
0
−
308
-10^{-308}
−10−308到
1
0
308
10^{308}
10308
NULL 值
缺少值通过特殊值- NULL表示
1.3 复杂类型
Hive复杂数据类型如下:
数组
在Hive数组与在Java中使用的方法相同.
Syntax: ARRAY<data_type>
映射
映射在Hive类似于Java的映射.
Syntax : MAP<primitive_type, data_type>
结构体
在Hive中结构体类似于使用复杂的数据.
Syntax: STRUCT<col_name: data_type [COMMENT col_comment], ...>
第二章 Hive数据库
1 Hive创建数据库
Hive是一种数据库技术, 可以定义数据库和表来分析结构化数据. 主题结构化数据分析是以表方式存储数据, 并通过查询来分析. 本篇文章介绍如何创建Hive数据库. 配置单元包含一个名为 default
默认的数据库.
CREATE DATABASE
语句
创建数据库是用来创建数据库在Hive中的语句. 在Hive数据库是一个命名空间或表的集合. 此语法声明如下.
CREATE DATABASE|SCHEMA [IF NOT EXISTS] <database name>
在这里, IF NOT EXISTS
是一个可选字句, 通知用户已经存在相同名称的数据库. 可以使用SCHEMA
在DATABASE
的这个命令. 下面的查询执行创建一个名为userdb
数据库.
hive> CREATE DATABASE [IF NOT EXISTS] userdb;
或
hive> CREATE SCHEMA userdb;
下面的查询用于验证数据库列表:
hive>SHOW DATABASE;
default
userdb
2 Hive删除数据库
DROP DATABASE语句
DROP DATABASE
是删除所有的表并删除数据库的语句. 它的语法如下:
DROP DATABASE StatementDROP (DATABASE|SCHEMA) [IFEXISTS] database_name
下面的查询用于删除数据库. 假设要删除的数据库名称为userdb.
hive> DROP DATABASE IF EXISTS userdb;
以下是使用CASCADE
查询删除数据库. 这意味着要全部删除相应的表在删除数据库之前.
hive> DROP DATABASE IF EXISTS userdb CASCADE;
以下使用SCHEMA查询删除数据库.
hive> DROP SCHEMA userdb;
Hive 表
1 Hive创建表
1.1 CREATE TABLE
语句
Create Table适用于在Hive中创建表的语句, 语法如下:
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[ROW FORMAT row_format]
[STORED AS file_format]
- 示例
假设需要使用CREATE TABLE
语句创建一个名为employee
表, 下表列出了employee
表中的字段和数据类型:
Sr.No | 字段名称 | 数据类型 |
---|---|---|
1 | Eid | int |
2 | Name | String |
3 | Salary | Float |
4 | Dedignation | string |
下面的数据是一个注释, 行格式字段, 如字段终止符, 行终止符, 并保存的文件类型.
COMMENT 'Employee details'
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED IN TEXT FILE;
hive> CREATE TABLE IF NOT EXISTS employee ( eid int, name String,
> salary String, destination String)
> COMMENT ‘Employee details’
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY ‘\t’
> LINES TERMINATED BY ‘\n’
> STORED AS TEXTFILE;
1.2 LOAD DATA
语句
一般来说, 在SQL创建表后, 我们就可以使用INSERT语句插入数据. 但是在Hive中, 可以使用LOAD DATA语句插入数据.
同时将数据插入到Hive中, 最好是使用LOAD DATA来存储大量记录. 有两种的方法来家在数据, 一种是从本地文件系统, 一种是从Hadoop文件系统.
- 语法
加载数据的语法如下:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
-
LOCAL 是标识符指定本地路径, 可选
-
OVERWRITE 是可选的, 覆盖表中的数据
-
PARTITION 这是可选的
-
示例
我们将插入下列数据到表中.
1201 Gopal 45000 Technical manager
1202 Manisha 45000 Proof reader
1203 Masthanvali 40000 Technical writer
1204 Kiran 40000 Hr Admin
1205 Kranthi 30000 Op Admin
假设存储的路径名为/home/user/sample.txt
hive> LOAD DATA LOCAL INPATH '/home/user/sample.txt' OVERWRITE INTO TABLE employee;
2 Hive修改表
2.1 ALTER TABLE
语句
他是在Hive中用来修改表的语句.
- 语法:
声明接受任意属性, 我们希望在一个表中修改以下语法.
alter table name rename to new_name;
alter table name add columns (col_spec[, col_spec ...]);
alter table name drop [column] column_name;
alter table name change column_name new_name new_type;
alter table name replace columns (col_spec[, col_spec ...]);
2.2 rename to
语句
重命名表, 比如将employee
重命名为 emp
hive> alter table employee rename to emp;
2.3 change
语句
change 语句一次查询只更改一个字段.
下表包含employee表的字段, 它显示的字段要被更改(粗体).
字段名 | 原数据类型 | 新字段名 | 转化为数据类型 |
---|---|---|---|
eid | int | eid | int |
name | String | ename | String |
salary | Float | salary | **Double |
designation | String | designation | String |
下面查询重命名使用上述数据的列名和列数据类型.
hive> alter table employee change name ename String;
hive> alter table employee change salary salary Double;
2.4 添加列语句
下面的查询增加了一个列名dept
在employee
表
hive> alter table employee add columns (dept String commnet 'department name')
2.5 replace
语句
replace 语句一次查询可以更改多个字段.
一条语句达到前文中change
语句的效果.
hive> alter table employee replace columns (
eid int empid int,
ename string name string
)
3 Hive删除表
DROP TABLE
语句
语法如下:
DROP TABLE [IF EXISTS] table_name;
以下删除一个名为employee
的表:
hive> DROP TABLE IF EXISTS employee;