hive基础操作有哪些
小编给大家分享一下hive基础操作有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
前言
Hive支持常见的SQL语句, 除此之外它还有其独特的部分. 常见SQL语句与关系型数据库(例如MySQL)中的语法一致, 这里就不再做详细说明. 我们主要来看Hive中不一样的部分.
Hive的所有操作可以去Hive官网查看, 点击此处LanguageManual
Hive其实并不难, 对于有写过SQL语句的人来说会更简单. 在学习Hive时, 建议大家边学边敲, 多做联系.
准备工作
既然要使用Hive就要有Hive的环境, 可以根据这篇博客来安装Hive以及与Hive相关的环境(Hadoop, Yarn)大数据生态圈搭建
这里我使用的是基于Mysql的远程模式来操作Hive.
操作流程
创建第一个表格
连接进入Hive shell 之后, 先建一个新的数据库, 之后的大部分操作我们都在这个数据库中来练习.
创建:
create database hive_test;
使用该数据库:
use hive_test;
然后, 创建第一个表gfstbl, 也可使用数据库.表的格式(例如hive_test.gfstbl).
CREATE TABLE gfstbl(
id INT,
name STRING,
age INT,
gfs ARRAY
address MAP
info STRUCT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';
解释说明:
create语句, ()中为字段之间用逗号分隔, 字段名称与类型之间用空格隔开. 这里字段的数据类型有整型, 字符串, 数组, 键值对以及结构体.
Hive支持的数据类型:
数据类型 注释
tinyint 短整型, 范围:-128~127
smallint 小整型, -32768~32767
int 整型, -232~232-1
bigint 大整型, 就很大
float 单精度浮点数
double 双精度浮点数
decimal 精度38位十进制数
date 日期
timestamp 时间戳
char 字符
string 字符串
varchar 可变长度字符串
array 数组类型
map 键值对类型
structs 结构化类型
ROW FORMAT DELIMITED : 行格式分隔
FIELDS TERMINATED BY ' ' : 字段之间使用空格分隔
COLLECTION ITEMS TERMINATED BY ',' : 集合(就是这的数据)使用逗号分隔
MAP KEYS TERMINATED BY ':' : 键值对使用冒号分隔
LINES TERMINATED BY '\n' : 记录之间使用换行符分隔
; : 每一条SQL语句结尾都需要以分号结束
除此之外, 如果去掉分号, 加上:LOCATION "/test"; , 就可设置源数据在HDFS中存放的位置, 若不设置默认就在Hive的工作目录区.
创建表的SQL语句公式如下, 我们会根据Hive表的类型将这一公式分开操作.
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name -- (Note: TEMPORARY available in Hive 0.14.0 and later)
[(col_name data_type [COMMENT col_comment], ... [constraint_specification])]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[SKEWED BY (col_name, col_name, ...) -- (Note: Available in Hive 0.10.0 and later)]
ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
[STORED AS DIRECTORIES]
[
[ROW FORMAT row_format]
[STORED AS file_format]
| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)] -- (Note: Available in Hive 0.6.0 and later)
]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)] -- (Note: Available in Hive 0.6.0 and later)
[AS select_statement]; -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
LIKE existing_table_or_view_name
[LOCATION hdfs_path];
data_type
: primitive_type
| array_type
| map_type
| struct_type
| union_type -- (Note: Available in Hive 0.7.0 and later)
primitive_type
: TINYINT
| SMALLINT
| INT
| BIGINT
| BOOLEAN
| FLOAT
| DOUBLE
| DOUBLE PRECISION -- (Note: Available in Hive 2.2.0 and later)
| STRING
| BINARY -- (Note: Available in Hive 0.8.0 and later)
| TIMESTAMP -- (Note: Available in Hive 0.8.0 and later)
| DECIMAL -- (Note: Available in Hive 0.11.0 and later)
| DECIMAL(precision, scale) -- (Note: Available in Hive 0.13.0 and later)
| DATE -- (Note: Available in Hive 0.12.0 and later)
| VARCHAR -- (Note: Available in Hive 0.12.0 and later)
| CHAR -- (Note: Available in Hive 0.13.0 and later)
array_type
: ARRAY < data_type >
map_type
: MAP < primitive_type, data_type >
struct_type
: STRUCT < col_name : data_type [COMMENT col_comment], ...>
union_type
: UNIONTYPE < data_type, data_type, ... > -- (Note: Available in Hive 0.7.0 and later)
row_format
: DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
[NULL DEFINED AS char] -- (Note: Available in Hive 0.13 and later)
| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
file_format:
: SEQUENCEFILE
| TEXTFILE -- (Default, depending on hive.default.fileformat configuration)
| RCFILE -- (Note: Available in Hive 0.6.0 and later)
| ORC -- (Note: Available in Hive 0.11.0 and later)
| PARQUET -- (Note: Available in Hive 0.13.0 and later)
| AVRO -- (Note: Available in Hive 0.14.0 and later)
| JSONFILE -- (Note: Available in Hive 4.0.0 and later)
| INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname
constraint_specification:
: [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE ]
[, CONSTRAINT constraint_name FOREIGN KEY (col_name, ...) REFERENCES table_name(col_name, ...) DISABLE NOVALIDATE
查看第一个表的结构
查看表结构的公式:
DESCRIBE [EXTENDED|FORMATTED] table_name
EXTENDED 极简的方式显示
FORMATTED 格式化方式来显示
只查看表字段及类型, 结果如下图
DESC gfstbl;
或
DESCRIBE gfstbl;
极简方式查看表结构, 结果如下图
DESCRIBE EXTENDED gfstbl;
格式化方式查看表, 结果如下图
DESCRIBE FORMATTED gfstbl;
表中加载数据
待加载数据
数据内容如下:
001 zhangsan 19 Girl1,Girl2,Girl3 Girl1:qingdao,Girl2:jinan,Girl3:nanjing zhongguo,shandong,weifang
002 lisi 20 GirlA,GirlB GirlA:American,GirlB:长沙 zhongguo,shandong,qingdao
将这两行数据复制到gfs.txt文件中
vim /root/gfs.txt
然后复制粘贴数据
导入数据到Hive表中
load data local inpath '/root/gfs.txt' into table hive_test.gfstbl;
需要注意: load方式插入数据不会启动MR任务, load的实质是将文件上传到hdfs目录中.
查看数据的三种方式
使用select语句
select * from gfstbl;
2. 通过hdfs集群操作
hdfs dfs -ls /user/hive_meta/warehouse/hive_test.db/gfstbl
hdfs dfs -cat /user/hive_meta/warehouse/hive_test.db/gfstbl/*
3. 通过webUI页面
进图webUI页面, 找到文件对应位置
查看数组,键值对,结构体数据的某个值
对于 数组 使用 : 列名[索引] 的形式查看(索引下标从0开始)
对于键值对使用 : 列名["Key"]
对于结构体使用 : 列名.属性
select gfs[0],address["Girl2"],info.city from gfstbl;
删除表的方式
drop table gfstbl2;
此处需要注意, 如果通过hdfs操作删除表所在的目录, hive中表还会存在. 原因在于mysql的hive_meta数据库中还存有该表的元数据信息.
知识积累
Hive中创建表的三种方式
通过编写完整的CREATE语句创建, 如上文中我们创建gfstbl时的语句:
CREATE TABLE gfstbl(
id INT,
name STRING,
age INT,
gfs ARRAY
address MAP
info STRUCT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';
通过使用CREATE和LIKE关键词创建一个与原来表结构完全相同, 但没有数据的新表:
create table gfstbl1 like gfstbl;
通过使用CREATE, AS和SELECT关键词创建一个不仅表结构一样而且数据也一样的新表:
create table gfstbl2 AS SELECT id,name,gfs,address,info from gfstbl;
注意, 由于这种方式插入数据使用的是insert来插入数据, 因此会启动MR任务.
Hive表中插入数据的四种方式
insert 新数据, 最简单, 最基本也是最少用的方式, 直接写insert语句.
insert into table(col...) values(val...)
1
load方式, 最常用也是效率最高的方式
LOAD DATA命令,可分为LOAD DATA LOCAL INPATH和LOAD DATA INPATH。两者的区别在于LOCAL导入的是本地文件而不加LOCAL的导入的是HDFS文件
LOAD DATA INPATH '/a.txt' INTO TABLE user
1
查询(select)其他表数据 insert 到新表中
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;
或
FROM from_statement
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1
习惯上使用第二种语法, 即将from语句提前, 减少SQL代码的冗余.
from user
insert into user_count
select count(*)
insert into user_copy
select *;
直接使用hdfs命令将符合格式的文件放到该表在HDFS对应的目录下
Hive中表的类型
内部表
与数据库中的Table在概念上类似, 每一个内部表在Hive中都有一个相应的目录存数据, 所有表的数据(不包括External Table)都保存在这个目录中. 如上文中创建的gfstbl表.
删除表时,元数据与数据都会删除.
临时表
临时表的生命周期是一次会话, 当本次会话结束时, 临时表会自动删除.
外部表
删除表时, 元数据会被删除, 但数据(存放在HDFS)不会被删除.
分区表
将一批数据分成多个目录来存储, 从而防止暴力扫描. 分区表分为静态分区表和动态分区表.
分桶表
分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储. 由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中, 对于hive中每一个表、分区都可进一步分桶.
以上是"hive基础操作有哪些"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!