数据仓库工具——Hive表操作

Posted 小企鹅推雪球!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据仓库工具——Hive表操作相关的知识,希望对你有一定的参考价值。

文章目录

Hive——分区表

  1. Hive在执行查询时,一般会扫描整个表的数据。由于表的数据量大,全表扫描消耗时间长、效率低。

  2. 有时候,查询只需要扫描表中的一部分数据即可,Hive引入了分区表的概念,将表的数据存储在不同的子目录中,每一个子目录对应一个分区。只查询部分分区数据时,可避免全表扫描,提高查询效率。

  3. 在实际中,通常根据时间、地区等信息进行分区

  4. 分区表创建与数据加载

    -- 创建表
    create table if not exists t3(
    id int
    ,name string
    ,hobby array<string>
    ,addr map<String,string>
    )
    partitioned by (dt string)
    row format delimited
    fields terminated by ';'
    collection items terminated by ','
    map keys terminated by ':';
    
    -- 加载数据。
    load data local inpath "/home/hadoop/data/t1.dat" into table t3
    partition(dt="2021-01-14");
    load data local inpath "/home/hadoop/data/t1.dat" into table t3
    partition(dt="2021-01-14");
    
    -- 查看分区
    show partitions t3;
    
  5. 新增分区并设置数据

    -- 增加一个分区,不加载数据
    alter table t3 add partition(dt='2022-01-13');
    
    -- 增加多个分区,不加载数据
    alter table t3
    add partition(dt='2022-01-12') partition(dt='202-01-11');
    -- 增加多个分区。准备数据
    hdfs dfs -cp /user/hive/warehouse/mydb.db/t3/dt=2022-01-14 /user/hive/warehouse/mydb.db/t3/dt=2022-01-10
    hdfs dfs -cp /user/hive/warehouse/mydb.db/t3/dt=2022-01-14 /user/hive/warehouse/mydb.db/t3/dt=2022-01-09
    
    -- 增加多个分区。加载数据
    alter table t3 add
    partition(dt='2022-01-10') location '/user/hive/warehouse/mydb.db/t3/dt=2022-01-10'
    partition(dt='2022-01-09') location '/user/hive/warehouse/mydb.db/t3/dt=2022-01-09';
    
    -- 查询数据
    select * from t3;
    
  6. 修改分区的hdfs路径:

    alter table t3 partition(dt='2022-01-14') set location '/user/hive/warehouse/t3/dt=2022-01-12';
    
  7. 删除分区;

    -- 可以删除一个或多个分区,用逗号隔开
    alter table t3 drop partition(dt='2022-01-14'), partition(dt='2022-01-13');
    

Hive——分桶表

  1. 当单个的分区或者表的数据量过大,分区不能更细粒度的划分数据,就需要使用分桶技术将数据划分成更细的粒度。

  2. 将数据按照指定的字段进行分成多个桶中去,即将数 据按照字段进行划分,数据按照字段划分到多个文件当中去。

  3. 分桶的原理:MR中:key.hashCode % reductTask,Hive中:分桶字段.hashCode % 分桶个数

  4. 分桶表操作:数据按照:(分区字段.hashCode) % (分桶数) 进行分区

    -- 创建分桶表
    create table course(
    id int,
    name string,
    score int
    )
    clustered by (id) into 3 buckets
    row format delimited fields terminated by "\\t";
    
    -- 创建普通表
    create table course_common(
    id int,
    name string,
    score int
    )
    row format delimited fields terminated by "\\t";
    
    -- 普通表加载数据
    load data local inpath '/home/hadoop/data/course.dat' into table course_common;
    
    -- 通过 insert ... select ... 给桶表加载数据
    insert into table course select * from course_common;
    
    1. 分桶规则:分桶字段.hashCode % 分桶数
    2. 分桶表加载数据时,使用 insert… select … 方式进行
    3. 网上有资料说要使用分区表需要设置 hive.enforce.bucketing=true,那是Hive1.x 以前的版本;Hive 2.x 中,删除了该参数,始终可以分桶;

Hive——修改表 & 删除表

-- 修改表名。rename
alter table course_common
rename to course_common1;

-- 修改列名。change column
alter table course_common1
change column id cid int;

-- 修改字段类型。change column
alter table course_common1
change column cid cid string;

-- 修改字段数据类型时,要满足数据类型转换的要求。如int可以转为string,但是string不能转为int

-- 增加字段。add columns
alter table course_common1
add columns (common string);

-- 删除字段:replace columns
-- 这里仅仅只是在元数据中删除了字段,并没有改动hdfs上的数据文件
alter table course_common1
replace columns(id string, cname string, score int);

-- 删除表
drop table course_common1;

文章目录

Hive装载数据(Load)

  1. 装载数据(Load):

    基本语法:
    LOAD DATA [LOCAL] INPATH 'filepath'
    [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1,partcol2=val2 ...)]
    
    1. LOAD DATA LOCAL … 从本地文件系统加载数据到Hive表中。本地文件会拷贝到Hive表指定的位置
    2. LOAD DATA … 从HDFS加载数据到Hive表中。HDFS文件移动到Hive表指定的位置
    3. INPATH:加载数据的路径
    4. OVERWRITE:覆盖表中已有数据;否则表示追加数据
    5. PARTITION:将数据加载到指定的分区
    -- 创建表
    CREATE TABLE tabA (
    id int
    ,name string
    ,area string
    ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;
    
    数据文件(~/data/sourceA.txt):
    1,fish1,SZ
    2,fish2,SH
    3,fish3,HZ
    4,fish4,QD
    5,fish5,SR
    
    -- 拷贝文件到 HDFS
    hdfs dfs -put sourceA.txt data/
    
    -- 加载本地文件到hive(tabA) 本地文件还在
    LOAD DATA LOCAL INPATH '/home/hadoop/data/sourceA.txt' INTO TABLE tabA;
    
    -- 加载hdfs文件到hive(tabA) HDFS文件,已经被转移
    LOAD DATA INPATH 'data/sourceA.txt' INTO TABLE tabA;
    
    -- 加载数据覆盖表中已有数据
    LOAD DATA INPATH 'data/sourceA.txt'  OVERWRITE INTO TABLE tabA;
    
    
    
    -- 创建表时加载数据
    hdfs dfs -mkdir /user/hive/tabB
    hdfs dfs -put sourceA.txt /user/hive/tabB
    
    CREATE TABLE tabB (
    id INT
    ,name string
    ,area string
    ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
    Location '/user/hive/tabB';
    

Hive插入数据(Insert)

-- 创建分区表
CREATE TABLE tabC (
id INT
,name string
,area string
)
partitioned by (month string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

-- 插入数据
insert into table tabC
partition(month='202201')
values (5, 'wangwu', 'BJ'), (4, 'lishi', 'SH'), (3,'zhangsan', 'TJ');

-- 插入查询的结果数据
insert into table tabC partition(month='202202')
select id, name, area from tabC where month='202201' ;

-- 多表(多分区)插入模式
insert overwrite table tabC partition(month='202003')
select id, name, area where month='202002'
insert overwrite table tabC partition(month='202004')
select id, name, area where month='202002';

-- 创建表并插入数据(as select)
-- 根据查询结果创建表
create table if not exists tabD
as select * from tabC;

-- 使用import导入数据
 import table student2 partition(month='201709') from '/user/hive/warehouse/export/student';

Hive数据导出

-- 将查询结果导出到本地
insert overwrite local directory '/home/hadoop/data/tabC' 
select * from tabC;

-- 将查询结果格式化输出到本地
insert overwrite local directory '/home/hadoop/data/tabC2' 
row format delimited fields terminated by ' '
select * from tabC;

-- 将查询结果导出到HDFS
insert overwrite directory '/user/hadoop/data/tabC3'
row format delimited fields terminated by ' '
select * from tabC;

-- dfs 命令导出数据到本地。本质是执行数据文件的拷贝
dfs -get /user/hive/warehouse/mydb.db/tabc/month=202001 /home/hadoop/data/tabC4

-- hive 命令导出数据到本地。执行查询将查询结果重定向到文件
hive -e "select * from tabC" > a.log

-- export 导出数据到HDFS。使用export导出数据时,不仅有数还有表的元数据信息
export table tabC to '/user/hadoop/data/tabC4';

-- export 导出的数据,可以使用 import 命令导入到 Hive 表中
-- 使用 like tname创建的表结构与原表一致。create ... as select ... 结构可能不一致
create table tabE like tabc;
import table tabE from ''/user/hadoop/data/tabC4';

-- 截断表,清空数据。(注意:仅能操作内部表) 外部表不能执行 truncate 操作
truncate table tabE;

以上是关于数据仓库工具——Hive表操作的主要内容,如果未能解决你的问题,请参考以下文章

数据仓库工具——Hive表操作

一脸懵逼学习Hive(数据仓库基础构架)

数据仓库工具Hive

数据仓库Hive

大数据——Hive(数据仓库工具)

Hive数据仓库工具安装