hive的数据文件存储格式

Hive存储格式
本文介绍了Hive中五种数据文件存储格式的特点及应用场景:textfile为默认格式但占用较大磁盘空间;sequencefile为二进制存储,支持压缩且便于查询;rcfile采用行列混合存储,提高查询效率;orc是对rcfile的优化;parquet则允许自定义输入输出格式。

hive的数据文件存储格式

类型

  • texfile:默认的存储格式:普通的文本文件,数据不压缩,磁盘的开销比较大,分析开销大。
  • sequencefile:提供的一种二进制存储格式,可以切割,天生压缩。
  • rcfile:提供的是一种行列混合存储方式,该方式会把相近的行和列数据放在一块儿,存储比较耗时,查询效率高,也天生压缩。
  • orc:是rcfile的一种优化存储。
  • parquet:自定义输入输出格式。

具体描述

1、texfile普通文本文件(通常默认的就是这个格式)

  • 创建表

    create table if not exists one (
    	id int,
    	name string
    )
    row format delimited fileds terminated by'\t'
    storted as textfile
    ;
    
  • 加载数据
    load data local inpath ‘localpath’ into table one;

2、sequencefile二进制放式:hive提供的二进制序列文件存储,天生压缩。默认支持压缩、分割,使用便捷、写和查询较快。sequencefile和压缩属性可以搭配使用

  • 注意:sequeceFile不允许使用load方式加载数据。需要使用insert 方式插入。

  • 创建数据

    create table if not exists tow(
    id int,
    name string
    )
    row format delimited fields terminated by '\t'
    lines terminated by '\n'
    stored as sequencefile
    ;
    
  • 加载数据正确方式

    insert into table tow select * from one;
    
  • 说明:存储的文件不能直接用cat命令去查看文件。

3、rcfile行列混合存储方式:rcfile可以进行行列混合压缩,将附近的列和行的数据尽量保存到相同的块里面,该存储格式会提高查询效率,但是写数据较慢。该方式和gzcodeC压缩属性结合不是很好,(orf与这个效果一样只是,他的效率比rcfile高很多)

  • 可以配合使用的压缩算法

    set mapred.output.compression=true;
    set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
    
  • 注意: rcfile不允许使用load方式加载数据。需要使用insert 方式插入。

  • 创建数据

    create table if not exists three(
    id int,
    name string
    )
    row format delimited fields terminated by '\t'
    lines terminated by '\n'
    stored as rcfile
    ;
    
  • 加载数据正确方式

    insert into table three select * from one;
    

4、parquet存储自定义:

  • 创建数据

    ##hello,hive
    ##hello,world
    ##hello,hadoop
    
  • 自定义创建表

    create table if not exists four(
    	str string
    )  
    stored as  
    inputformat 'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextInputFormat'  
    outputformat 'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextOutputFormat'
    ;
    
  • 加载数据

    load data local inpath 'localpath' into table four;
    
  • 注意:通常是使用 defaultCodec + rcfile搭配效率最好。

<think> 首先,用户的问题是:“我想查找在Hive中修改表存储格式的方法 请问Hive中修改表存储格式的方法”。 根据系统级指令,我需要: - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1]。 - 确保所有行内数学表达式用$...$,独立公式用$$...$$。 - LaTeX语法正确。 用户提供了三个引用: - 引用[1]:关于Hive元数据存储在数据库中,如MySQL等。[^1] - 引用[2]:解释了external table和普通表的区别。[^2] - 引用[3]:描述了SequenceFile存储格式。[^3] 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但在这个对话中,这是第一次用户询问这个问题,所以没有“上一次的问题”。可能用户是指参考提供的引用。 用户的核心需求是查找在Hive中修改表存储格式的方法。 回想一下Hive的知识: - Hive支持多种存储格式,如TextFile、SequencFile、RCFile、ORC、Parquet等。 - 修改表的存储格式通常使用`ALTER TABLE`语句。 - 格式可以通过`STORED AS`子句指定。 从引用中: - 引用[1]提到元数据存储在数据库中,但没直接说修改存储格式的方法。 - 引用[2]讨论了external table,但焦点在数据位置,不是存储格式。 - 引用[3]详细说明了SequenceFile格式,但没给出修改方法。 所以,我需要基于一般知识回答。用户提供了引用,所以我应该适当地引用它们。 回答结构: - 由于系统指令说“回答结构清晰,帮助用户逐步解决问题”,我应该分步骤解释。 - 最后生成相关问题。 步骤: 1. 解释什么是Hive存储格式。 2. 描述如何修改存储格式,包括语法。 3. 可能讨论常见格式和它们的优缺点。 4. 引用提供的引用相关部分。 5. 结束时生成相关问题。 引用标识: - 在相关句子末尾添加[^1], [^2], [^3]。 例如: - 如果提到元数据存储,引用[1]。 - 如果提到external table,引用[2]。 - 如果提到SequenceFile,引用[3]。 用户查询是修改存储格式,所以我需要关注`ALTER TABLE`命令。 常见命令: - `ALTER TABLE table_name SET FILEFORMAT file_format;` - 或者`ALTER TABLE table_name SET SERDE serde_class_name WITH SERDEPROPERTIES (properties);` 文件格式如: - `STORED AS TEXTFILE` - `STORED AS SEQUENCEFILE` - `STORED AS RCFILE` - `STORED AS ORC` - `STORED AS PARQUET` 在修改时,可能需要考虑表类型(managed or external),但存储格式修改类似。 从引用[2],external表删除时不影响HDFS数据,这可能相关,因为修改格式可能需要数据转换。 完整回答: 1. 介绍:Hive存储格式决定了数据在HDFS上的存储方式。 2. 方法:使用`ALTER TABLE`语句修改存储格式。 - 语法:`ALTER TABLE table_name SET FILEFORMAT file_format;` - 示例:`ALTER TABLE my_table SET FILEFORMAT ORC;` 3. 注意事项:修改格式可能需要重写数据;对于外部表,数据位置保持不变。[^2] 4. 常见格式:引用[3]提到的SequenceFile是一种二进制格式。[^3] 5. 元数据:Hive元数据存储在数据库中如MySQL,修改存储格式会更新元数据。[^1] 生成相关问题: - 1. Hive支持哪些存储格式? - 2. 修改存储格式后数据如何迁移? - 3. ORC和Parquet格式的区别是什么? 确保语言中文。 </think> ### Hive中修改表存储格式的方法 在Hive中,表存储格式决定了数据在HDFS上的物理存储方式(如文本、二进制、列式存储)。修改表的存储格式主要通过`ALTER TABLE`语句实现,结合`SET FILEFORMAT`选项或`SET SERDE`命令。以下我将一步步解释方法和注意事项,尽量保证真实可靠(基于Hive标准文档和最佳实践)。 #### 1. **基本方法:使用`ALTER TABLE`命令** - **语法格式**:最常见的修改方式是直接指定文件格式: ```sql ALTER TABLE table_name SET FILEFORMAT file_format; ``` - `table_name`:要修改的表名。 - `file_format`:目标存储格式,如`TEXTFILE`(默认)、`SEQUENCEFILE`、`RCFILE`、`ORC`、`PARQUET`等。 - **示例**:将一个名为`sales`的表存储格式改为ORC格式: ```sql ALTER TABLE sales SET FILEFORMAT ORC; ``` - 执行后,Hive会更新元数据,但**不会自动重写现有数据**。新插入的数据会使用新格式存储,而旧数据保留原格式(可能导致查询性能问题)[^1]。 #### 2. **使用`SET SERDE`指定序列化/反序列化器** - 如果存储格式需要自定义序列化器(如一些二进制格式),使用`SET SERDE`命令: ``` ALTER TABLE table_name SET SERDE 'serde_class_name' WITH SERDEPROPERTIES (property_name=property_value, ...); ``` - `serde_class_name`:序列化类全限定名,例如`org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe`用于RCFile。 - 示例:修改表为SequenceFile格式(一种高效的二进制格式,适合大数据处理,Hive中key为空,value存放实际值)[^3]: ```sql ALTER TABLE log_data SET SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ('serialization.format' = '1'); ``` #### 3. **注意事项和最佳实践** - **数据迁移需求**: - `ALTER TABLE SET FILEFORMAT`仅改变新写入数据的格式。**要彻底转换格式,必须重写整个表数据**。常用方法是创建一个新表,再插入数据: ```sql CREATE TABLE new_table STORED AS ORC AS SELECT * FROM old_table; -- 创建新格式表 ALTER TABLE old_table RENAME TO backup_table; -- 重命名原表(可选) ALTER TABLE new_table RENAME TO old_table; -- 恢复原名 ``` - 这避免了查询时混合格式导致的性能下降。 - **外部表(External Table)的特殊处理**: - 外部表的数据存储在HDFS自定义路径,删除表时只移除元数据,不删除HDFS文件[^2]。修改存储格式时,同样需手动迁移数据: ```sql ALTER TABLE external_table SET FILEFORMAT PARQUET; -- 修改元数据 INSERT OVERWRITE TABLE external_table SELECT * FROM external_table; -- 强制重写数据 ``` - 注意:`INSERT OVERWRITE`会覆盖原数据,确保备份以防丢失。元数据更新依赖于Hive的数据库存储(如MySQL)[^1]。 - **性能影响**: - 不同格式有不同优缺点: - `TEXTFILE`:易读但性能差。 - `SEQUENCEFILE`:二进制格式,压缩率高,但读写开销大[^3]。 - `ORC/PARQUET`:列式存储,适合分析查询。 - 修改后,使用`ANALYZE TABLE`更新统计信息以优化查询性能。 - **兼容性**: - 确保Hive版本支持目标格式(如ORC需要Hive 0.11+)。 - 如果表有分区,需对每个分区单独操作(或使用`ALTER TABLE ... PARTITION`)。 #### 4. **总结** 修改Hive存储格式的核心是通过`ALTER TABLE`命令更新元数据,但数据迁移是必要步骤。Hive将元数据存储在外部数据库(如MySQL)以保证高频更新[^1],而外部表的数据位置独立于元数据[^2]。SequenceFile等二进制格式能提升效率,但需权衡性能需求[^3]。实际操作前,建议在测试环境验证。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值