Hive - 表相关

 

 

 

一、文件存储格式

 

Hive的文件存储格式包括:textfilesequencercfileorcparquet

 

textfile

简介)默认的文件格式,基于行存储。建表时不指定存储格式即为textfile,导入数据时把数据文件拷贝到hdfs不进行处理。

优点)便于和其他工具(pig,grep,sed,awk)共享数据,便于查看和编辑,加载较快。

缺点)耗费存储空间,I/O性能较低;Hive不进行数据切分合并,不能进行并行操作,查询效率低。

应用场景)适用于小型查询,查看具体数据内容的测试操作。

 

sequence

简介)含有键值对的二进制文件,行存储。

优点)可压缩、可分割,优化磁盘利用率和I/O;可并行操作数据,查询效率高。

缺点)存储空间消耗最大;对于hadoop生态系统之外的工具不适用,需要通过text文件转化加载。

应用场景)适用于数据量较小、大部分列的查询。

 

rcfile

简介)行列式存储。先将数据按行分块,同一个record 在一个块上,避免读一条记录需要读多个 block;然后块数据列式存储。

优点)可压缩,高效的列存取;查询效率较高。

缺点)加载时性能消耗较大,需要通过 text 文件转化加载;读取全量数据性能低。

 

orc

简介)优化后的 rcfile,行列式存储。

优缺点)优缺点与rcfile类似,查询效率较高。

应用场景)适用于hive中大型的存储、查询。

在2021到2023这三年的工作中,遇到最多的表的存储格式,但一般都是开启事务,即torc表。

 

parquet

简介)列存储

优点)更高效的压缩和编码;不与任何数据处理技术绑定,可用于多种数据处理框架(hive、Impala,Presto查询引擎;MR,Spark计算框架;Avro,Thrift,PB数据模型)。

缺点)不支持 update,insert,delete,ACID

应用场景)适用于字段数非常多,无更新,只取部分列的查询。

 

 

 

 

 

二、表的存储方式(管理方式)

 

外部表

默认创建的表即为外部表(建表语句如下)

create table table_name(
    id int,
    name string
)
-- 负载均衡
clustered by (id) 
-- 桶
into 2 buckets 
-- 记录行的分隔符
row format delimited
-- 记录列的分隔符
fields terminated by ','
-- 存储文件的格式:textfile是默认的,写与不写都是一样的
stored as orc   -- textfile 不支持事务,而orc支持事务
-- 表的属性
tblproperties("transactional"="true", -- 是否开启事务
    "compactor.mapreduce.map.memory.mb"="2048",
    "compactorthreshold.hive.compactor.delta.num.threshold"="4",
    "compactorthreshold.hive.compactor.delta.pct.threshold"="0.5"
)

 

内部表

与外部表的区别是,hive仅管理外部表的元数据,而不管理其在HDFS上的数据。(建表语句如下)

create external table table_name(
    id int,
    name string
)
-- 负载均衡
clustered by (id) 
-- 桶
into 2 buckets 
-- 记录行的分隔符
row format delimited
-- 记录列的分隔符
fields terminated by ','
-- 存储文件的格式:textfile是默认的,写与不写都是一样的
stored as orc   -- textfile 不支持事务,而orc支持事务
-- 表的属性
tblproperties("transactional"="true", -- 是否开启事务
    "compactor.mapreduce.map.memory.mb"="2048",
    "compactorthreshold.hive.compactor.delta.num.threshold"="4",
    "compactorthreshold.hive.compactor.delta.pct.threshold"="0.5"
)

 

很明显,从建表语句上看,创建内部表需要在create后面添加external关键字,两者的区别可以看下面的表格

 

drop table时 内部表(Managed Table) 外部表(External Table)
MySQL(元数据库)中的表结构和数据 会被删除 会被删除
HDFS中的记录(真实数据) 会被删除 仍然存在

 

 

三、建表的几种方式

 

create table as

  • 这个命令主要用于根据查询结果创建新表,并复制原数据,也就是说,它会将查询结果作为新表的数据内容。
  • create table as语句在创建新表的同时,也会填充数据。它实际上执行了查询操作,并将查询结构存储到新表中。
  • 这种方式主要适用于需要快速复制数据并创建一个新表的情况。

 

 

create table like

  • 这个命令用于创建一个与现有表结构相同的新表,但不会复制数据。新表会继承源表的表结构,包括索引和主键等。
  • 要复制源表和数据到新表,需要使用insert into语句单独执行。
  • create table like主要用于需要保留表结构但不需要复制数据的场景,比如备份表结构或者创建一个空的表结构用于后续的数据插入。

 

  总结来说,create table ascreate table like的主要区别在于:

    • 前者(create table as)不仅创建新表,还复制原数据(列结构和数据和源表一致,但不包括源表其他属性:分区、存储格式等)
    • 后者(create table like)仅创建与源表结构相同的新表,不复制数据。
    • 根据具体的需求和场景,可以选择适合的创建表的方式。

  如果希望新表在各个方面(包括结构、数据、分区、存储格式等)都和源表一模一样,那么你需要首先使用create table like来创建结构相同的表,然后使用insert into语句来复制数据。同时,你可能还需要手动设置新表的分区和存储格式等属性,以确保它们与源表一致。

 

 

 

 

 

 

 

 

— 要养成终生学习的习惯 —

posted @   HOUHUILIN  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示