hive表的源文件存储格式

Hive列式存储格式详解
本文详细介绍了Hive的几种文件存储格式,包括textfile、sequencefile、rcfile、orc以及自定义格式。列出了各种格式的特点,如textfile适合直接查看但效率低,sequencefile压缩好且查询高效,rcfile和orc则优化了压缩和查询速度,其中orc在性能上优于rcfile。列式存储引擎在大数据场景下,尤其在处理多列但每次查询涉及较少列的情况时,表现出较高的性价比。

Hive文件存储格式
1.textfile
textfile为默认格式
存储方式:行存储
磁盘开销大 数据解析开销大,压缩的text文件 hive无法进行合并和拆分
(建表时不指定它会默认为这个格式,导入数据时会直接把数据文件拷贝到HDFS上不进行处理,源文件可以直接通过hadoop fs -cat 查看。)

2.sequencefile
二进制文件,以<key,value>的形式序列化到文件中
存储方式:行存储,可分割 压缩,一般选择block压缩
优势是文件和Hadoop api中的mapfile是相互兼容的。

(sequencefile这是一种Hadoop API提供的二进制的文件使用方便)
3.rcfile
存储方式:数据按行分块 每块按照列存储
压缩快 快速列存取,读记录尽量涉及到的block最少,读取需要的列只需要读取每个row group 的头部定义。读取全量数据的操作 性能可能比sequencefile没有明显的优势

(rcfile存储数据首先将其数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block,其次块数据列式存储有利于数据压缩和快速的列存取,理论上具有高查询效率)

4.orc

存储方式:数据按行分块 每块按照列存储,压缩快 快速列存取,效率比rcfile高,是rcfile的改良版本

5.自定义格
用户可以通过实现inputformat和 outputformat来自定义输入输出格式。

Apache Parquet
源自于google Dremel系统(可下载论文参阅),Parquet相当于Google Dremel中的数据存储引擎,而Apache顶级开源项目Drill正是Dremel的开源实现。
Apache Parquet 最初的设计动机是存储嵌套式数据,比如Protocolbuffer,thrift,json等,将这类数据存储成列式格式,以方便对其高效压缩和编码,且使用更少的IO操作取出需要的数据,这也是Parquet相比于ORC的优势,它能够透明地将Protobuf和thrift类型的数据进行列式存储,在Protobuf和thrift被广泛使用的今天,与parquet进行集成,是一件非容易和自然的事情。 除了上述优势外,相比于ORC, Parquet没有太多其他可圈可点的地方,比如它不支持update操作(数据写成后不可修改),不支持ACID等。

Apache ORC
ORC(OptimizedRC File)存储源自于RC(RecordColumnar File)这种存储格式,RC是一种列式存储引擎,对schema演化(修改schema需要重新生成数据)支持较差,而ORC是对RC改进,但它仍对schema演化支持较差,主要是在压缩编码,查询性能方面做了优化。RC/ORC最初是在Hive中得到使用,最后发展势头不错,独立成一个单独的项目。Hive 1.x版本对事务和update操作的支持,便是基于ORC实现的(其他存储格式暂不支持)。ORC发展到今天,已经具备一些非常高级的feature,比如支持update操作,支持ACID,支持struct,array复杂类型。你可以使用复杂类型构建一个类似于parquet的嵌套式数据架构,但当层数非常多时,写起来非常麻烦和复杂,而parquet提供的schema表达方式更容易表示出多级嵌套的数据类型。


总结:
textfile 存储空间消耗比较大,并且压缩的text 无法分割和合并 查询的效率最低,可以直接存储,加载数据的速度最高
sequencefile 存储空间消耗最大,压缩的文件可以分割和合并 查询效率高,需要通过text文件转化来加载
rcfile 存储空间最小,查询的效率最高 ,需要通过text文件转化来加载,加载的速度最低

相比传统的行式存储引擎,列式存储引擎具有更高的压缩比,更少的IO操作而备受青睐(注:列式存储不是万能高效的,很多场景下行式存储仍更加高效),尤其是在数据列(column)数很多,但每次操作仅针对若干列的情景,列式存储引擎的性价比更高。

在互联网大数据应用场景下,大部分情况下,数据量很大且数据字段数目很多,但每次查询数据只针对其中的少数几行,这时候列式存储是极佳的选择

<think>我们正在讨论如何将原始数据导入Hive。根据引用[1]和引用[2],有两种主要方法:一种是使用`LOADDATAINPATH`语句将HDFS上的数据加载到Hive,另一种是将本地数据直接上传到Hive(实际上Hive并不直接存储数据,而是将数据移动到HDFS的Hive目录下)。但是,用户的问题是关于加载原始数据到Hive,所以我们需要详细说明这两种方法,并注意区分数据是存放在本地还是HDFS上。方法一:使用LOADDATAINPATH(从HDFS加载)这种方法适用于数据已经存在于HDFS上的情况。它会将HDFS上的数据文件移动到Hive存储位置(注意:是移动,不是复制)。语法如下:```sqlLOADDATAINPATH'hdfs_path'[OVERWRITE]INTOTABLEtable_name;```其中:-'hdfs_path':HDFS上数据文件的路径。-OVERWRITE:可选,如果使用则会覆盖中已有数据,否则追加。方法二:使用LOADDATALOCALINPATH(从本地加载)如果数据在本地文件系统,我们可以使用`LOCAL`关键字。这时Hive会将本地文件复制到Hive的仓目录(HDFS上)中。语法:```sqlLOADDATALOCALINPATH'local_path'[OVERWRITE]INTOTABLEtable_name;```另外,还可以使用Hive的`INSERT`语句将查询结果插入到中,或者使用外部(ExternalTable)直接关联HDFS上的数据位置,这样就不需要移动数据。步骤示例:1.创建(如果不存在):```sqlCREATETABLEIFNOTEXISTSmy_table(col1STRING,col2INT)ROWFORMATDELIMITEDFIELDSTERMINATEDBY',';```这里假设数据是CSV格式,字段以逗号分隔。2.加载数据:-如果数据在本地:```sqlLOADDATALOCALINPATH'/path/to/local/file.csv'INTOTABLEmy_table;```-如果数据在HDFS:```sqlLOADDATAINPATH'/user/hadoop/file.csv'INTOTABLEmy_table;```注意事项:-使用`LOADDATA`命令会移动或复制文件到Hive的HDFS目录下,因此原始文件在加载后可能不再存在于原来的位置(使用`INPATH`会移动,使用`LOCALINPATH`会复制,所以本地文件仍然存在)。-对于大文件,建议先上传到HDFS,然后使用`LOADDATAINPATH`,避免长时间占用客户端资源进行复制。此外,还可以使用外部(ExternalTable)来避免数据移动:```sqlCREATEEXTERNALTABLEmy_external_table(col1STRING,col2INT)ROWFORMATDELIMITEDFIELDSTERMINATEDBY','LOCATION'/user/hadoop/external_table';```这样,只要将数据文件放在HDFS的`/user/hadoop/external_table`目录下,Hive就能直接读取,删除时数据不会被删除。因此,根据数据的位置和需求,可以选择不同的方法。生成相关问题:1.如何将本地文件上传到HDFS?2.Hive内部和外部有什么区别?3.如何将数据导出到HDFS或本地文件系统?</think>### 如何加载原始数据到Hive中 在Hive中加载原始数据主要有两种核心方法,根据数据存储位置选择不同的加载方式: #### 方法一:从本地文件系统直接加载(适合小规模数据) ```sql -- 语法结构 LOAD DATA LOCAL INPATH '本地文件路径' [OVERWRITE] INTO TABLE 名; -- 实际示例(加载CSV文件) LOAD DATA LOCAL INPATH '/home/user/data.csv' OVERWRITE INTO TABLE sales_data; ``` **特点**: 1. `LOCAL`关键字示从本地文件系统加载 2. `OVERWRITE`会覆盖中原有数据(省略则追加) 3. 文件会被**复制**到Hive数据仓目录(HDFS路径) 4. 适合数据量较小(GB级以下)的场景[^1] #### 方法二:从HDFS加载(适合大规模数据) ```sql -- 语法结构 LOAD DATA INPATH 'HDFS文件路径' [OVERWRITE] INTO TABLE 名; -- 实际示例(加载HDFS上的日志文件) LOAD DATA INPATH '/user/hadoop/logs/2023_access.log' INTO TABLE web_logs; ``` **特点**: 1. 省略`LOCAL`关键字示从HDFS加载 2. 文件会被**移动**到Hive对应的HDFS目录 3. 支持TB/PB级大数据加载 4. 需先通过`hadoop fs -put`将数据上传到HDFS[^2] #### 最佳实践建议 1. **数据预处理**:确保文件格式(CSV/TSV/JSON)与定义的`ROW FORMAT`匹配 ```sql CREATE TABLE user_events ( user_id STRING, event_time TIMESTAMP ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; ``` 2. **使用外部**防止误删数据: ```sql CREATE EXTERNAL TABLE raw_logs ( log_line STRING ) LOCATION '/hive/external/logs'; ``` 3. **分区优化**:对时间序列数据使用分区提升查询效率 ```sql ALTER TABLE sales_data ADD PARTITION (dt='2023-10-01'); ``` > **关键区别**:`LOCAL INPATH`执行文件复制(保留源文件),`INPATH`执行文件移动(源文件消失)[^1][^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值