千家信息网

hive基础操作有哪些

发表于:2024-11-27 作者:千家信息网编辑
千家信息网最后更新 2024年11月27日,小编给大家分享一下hive基础操作有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言  Hive支持常见的SQL语句
千家信息网最后更新 2024年11月27日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基础操作有哪些"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0