大数据(十九) -- Hive操作--基础

Hive常用操作

  • 前言
  • 准备工作
  • 操作流程
    • 创建第一个表格
    • 查看第一个表的结构
    • 表中加载数据
      • 待加载数据
      • 导入数据到Hive表中
    • 查看数据的三种方式
    • 查看数组,键值对,结构体数据的某个值
    • 删除表的方式
  • 知识积累
    • Hive中创建表的三种方式
    • 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<STRING>,
  address MAP<STRING,STRING>,
  info STRUCT<country:String,province:String,city:String>
)
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;

大数据(十九) -- Hive操作--基础_第1张图片

  极简方式查看表结构, 结果如下图

DESCRIBE EXTENDED gfstbl;

大数据(十九) -- Hive操作--基础_第2张图片

  格式化方式查看表, 结果如下图

DESCRIBE FORMATTED gfstbl;

大数据(十九) -- Hive操作--基础_第3张图片

表中加载数据

待加载数据

  数据内容如下:

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目录中.

查看数据的三种方式

  1. 使用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页面, 找到文件对应位置
大数据(十九) -- Hive操作--基础_第4张图片

查看数组,键值对,结构体数据的某个值

  对于 数组 使用 : 列名[索引] 的形式查看(索引下标从0开始)
  对于键值对使用 : 列名[“Key”]
  对于结构体使用 : 列名.属性

select gfs[0],address["Girl2"],info.city from gfstbl;

大数据(十九) -- Hive操作--基础_第5张图片

删除表的方式

drop table gfstbl2;

  此处需要注意, 如果通过hdfs操作删除表所在的目录, hive中表还会存在. 原因在于mysql的hive_meta数据库中还存有该表的元数据信息.

知识积累

Hive中创建表的三种方式

  1. 通过编写完整的CREATE语句创建, 如上文中我们创建gfstbl时的语句:
CREATE TABLE gfstbl(
  id INT,
  name STRING,
  age INT,
  gfs ARRAY<STRING>,
  address MAP<STRING,STRING>,
  info STRUCT<country:String,province:String,city:String>
)
ROW FORMAT DELIMITED  
FIELDS TERMINATED BY ' ' 
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':' 
LINES TERMINATED BY '\n';
  1. 通过使用CREATE和LIKE关键词创建一个与原来表结构完全相同, 但没有数据的新表:
create table gfstbl1 like gfstbl;
  1. 通过使用CREATE, AS和SELECT关键词创建一个不仅表结构一样而且数据也一样的新表:
create table gfstbl2 AS SELECT id,name,gfs,address,info from gfstbl;

  注意, 由于这种方式插入数据使用的是insert来插入数据, 因此会启动MR任务.

Hive表中插入数据的四种方式

  1. 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 *;
  1. 直接使用hdfs命令将符合格式的文件放到该表在HDFS对应的目录下

Hive中表的类型

  1. 内部表
      与数据库中的Table在概念上类似, 每一个内部表在Hive中都有一个相应的目录存数据, 所有表的数据(不包括External Table)都保存在这个目录中. 如上文中创建的gfstbl表.

  删除表时,元数据与数据都会删除.

  1. 临时表
      临时表的生命周期是一次会话, 当本次会话结束时, 临时表会自动删除.

  2. 外部表
      删除表时, 元数据会被删除, 但数据(存放在HDFS)不会被删除.

  3. 分区表
      将一批数据分成多个目录来存储, 从而防止暴力扫描. 分区表分为静态分区表和动态分区表.

  4. 分桶表
      分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储. 由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中, 对于hive中每一个表、分区都可进一步分桶.

  对这五种表的学习, 会在后续博客中再来讲解.

你可能感兴趣的:(大数据)