大数据之Hive数据库与表操作

文章目录

  • 前言
  • 一、Hive数据库和表操作
    • (一)数据库操作
      • 1. 创建数据库
      • 2. 删除数据库
    • (二)数据表操作
      • 1. 内部表和外部表的操作
        • 1.1 内部表操作
        • 1.2 外部表操作
      • 2. 复杂类型操作
        • 2.1 Array类型
        • 2.2 map类型
        • 2.3 struct类型
    • (三)表数据的插入方式


前言

#博学谷IT学习技术支持#

一、Hive数据库和表操作

(一)数据库操作

1. 创建数据库

1.1 在HDFS的默认Hive存储目录创建数据库

  create database if not exists myhivetest;

1.2 创建数据库并使用Location关键字指定HDFS存储位置

  create database myhivetest2 location '/myhivetest2';

2. 删除数据库

2.1 删除一个空的数据,如果该数据库下存在数据表,则会报错

  drop  database  myhivetest;

2.2 强制删除数据库,如果数据库下存在表,则连同数据表一起删除

  drop  database  myhivetest  cascade; 

(二)数据表操作

1. 内部表和外部表的操作

1.1 内部表操作

没有被external修饰的是内部表,删除内部表会直接删除元数据及存储数据,因此内部表不适合和其他工具共享数据

  • 创建内部表
create table student
(
     No   int,
     Name string
);
  • 创建表并指定字段之间的分隔符,指定字段之间用“\t”分隔
create table student2
(
     No   int,
     Name string
) row format delimited fields terminated by '\t';
  • 根据查询结果创建表
create table student3 as
select *
from student2;
  • 根据已经存在的表结构创建表
create table student4 like student3;
  • 删除表
drop table student2;

1.2 外部表操作

在创建表的时候通过指定external关键字创建外部表,外部表因为是指定其他的hdfs路径的数据加载到表当中来,所以hive表会认为自己不完全独占这份数据,所以删除hive外部表的时候,数据仍然存放在hdfs当中,不会删掉。

  • 数据装载命令Load
    Load命令用于将外部数据加载到Hive表中
load data [local] inpath '/export/data/datas/student3.txt' [overwrite] |
into table student3 [partition (partcol1=val1)]

1、load data:表示加载数据
2、local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表
3、inpath:表示加载数据的路径
4、overwrite:表示覆盖表中已有数据,否则表示追加
5、into table:表示加载到哪张表
6、student3:表示具体的表
7、partition:表示上传到指定分区

2. 复杂类型操作

2.1 Array类型

Array是数组类型,Array中存放相同类型的数据;
说明:name与locations之间制表符\t分隔,locations中元素之间逗号分隔

create external table hive_array
(
   name           string,
   work_locations array
)
   row format delimited fields terminated by '\t'
       collection items terminated by ',';
  • 导入数据
    Load方法支持从本地以及HDFS上导入数据
load data local inpath '/export/data/hivedatas/work_locations.txt' 
overwrite into table hive_array;
  • 常用查询
-- 查询所有数据
select *
from hive_array;

-- 查询work_locations数组中第一个元素
select name, work_locations[0] location
from hive_array;

-- 查询location数组中元素的个数
select name, size(work_locations) location_size
from hive_array;

-- 查询location数组中包含tianjin的信息
select *
from hive_array
where array_contains(work_locations, 'tianjin'); 

2.2 map类型

map就是描述key-value数据
说明:字段与字段分隔符: “,”;需要map字段之间的分隔符:“#”;map内部k-v分隔符:“:”

create table hive_map
(
   id      int,
   name    string,
   members map,
   age     int
)
   row format delimited
       fields terminated by ','
       collection items terminated by '#'
       map keys terminated by ':';
  • 导入数据
load data local inpath '/export/data/hivedatas/hive_map.txt' 
overwrite into table hive_map;
  • 常用查询
select *
from hive_map;

-- 根据键找对应的值
select id, name, members['father'] father, members['mother'] mother, age
from hive_map;

-- 获取所有的键
select id, name, map_keys(members) as relation
from hive_map;

-- 获取所有的值
select id, name, map_values(members) as relation
from hive_map;

-- 获取键值对个数
select id, name, size(members) num
from hive_map;

-- 获取有指定key的数据
select *
from hive_map
where array_contains(map_keys(members), 'brother');

-- 查找包含brother这个键的数据,并获取brother键对应的值
select id, name, members['brother'] brother
from hive_map
where array_contains(map_keys(members), 'brother');

2.3 struct类型

说明:字段之间#分割,第二个字段之间冒号分割

create table hive_struct
(
    ip   string,
    info struct
)
    row format delimited
        fields terminated by '#'
        collection items terminated by ':';
  • 导入数据
load data local inpath '/export/data/hivedatas/hive_struct.txt'
into table hive_struct;
  • 常用查询
select *
from hive_struct;

-- 根据struct来获取指定的成员的值
select ip, info.name
from hive_struct;

(三)表数据的插入方式

1、使用普通的insert语法插入数据,由于该方式会调用到MapReduce,所以效率较低,不建议使用

insert into table score3 partition (dt = '2022-10-01')
values ('001', '002', 100);

2、(推荐)使用insert+select的方式添加数据,效率较高

insert overwrite table score4 partition (dt = '2022-10-01')
select sid, cid, sscore
from score;

3、(推荐)通过load data的方式,将文件中的数据添加到Hive中

load data local inpath '/export/data/hivedatas/score.txt'
    overwrite into table score5 partition (dt = '2022-10-01');

4、从已存在的表中获取表结构以及数据,从而达到新建表的效果

create table score5 as
select *
from score;

5、(推荐)创建外部表,使用location关键字从HDFS中获取数据

create external table score6
(
    sid    string,
    cid    string,
    sscore int
)
    row format delimited fields terminated by '\t' location '/myscore6';

6、原先已经存在数据表结构的前提下,将文档中的数据添加到HDFS相对于的位置,从而达到添加数据的效果

hadoop fs -put stu.txt /user/hive/warehouse/myhive.db/stu

7、(推荐)使用sqoop导入数据到Hive中

sqoop框架将数据直接导入hive 

你可能感兴趣的:(Hive,hive,大数据,mapreduce)