Hive文件格式(表STORE AS 的四种类型)

本文详细介绍了Hive中的四种文件存储方式:TEXTFILE、SEQUENCEFILE、RCFILE和ORCFILE,包括它们的特性、操作方法以及存储情况对比。重点强调了RCFILE在数据仓库场景中的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hive文件存储格式包括以下几类:

1、TEXTFILE

2、SEQUENCEFILE

3、RCFILE

4、ORCFILE(0.11以后出现)

其中TEXTFILE为默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理;

SEQUENCEFILE,RCFILE,ORCFILE格式的表不能直接从本地文件导入数据,数据要先导入到textfile格式的表中, 然后再从表中用insert导入SequenceFile,RCFile,ORCFile表中。

前提创建环境:

hive 0.8

创建一张testfile_table表,格式为textfile。

create table if not exists testfile_table( site string, url  string, pv   bigint, label string) row format delimited fields terminated by '\t' stored as textfile;

load data local inpath '/app/weibo.txt' overwrite into table textfile_table;

一、TEXTFILE
默认格式,数据不做压缩,磁盘开销大,数据解析开销大。
可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,
从而无法对数据进行并行操作。
示例:

复制代码
create table if not exists textfile_table(
site string,
url  string,
pv   bigint,
label string)
row format delimited
fields terminated by '\t'
stored as textfile;
插入数据操作:
set hive.exec.compress.output=true;  
set mapred.output.compress=true;  
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;  
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;  
insert overwrite table textfile_table select * from textfile_table;  
复制代码

二、SEQUENCEFILE
SequenceFile是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。
SequenceFile支持三种压缩选择:NONE,RECORD,BLOCK。Record压缩率低,一般建议使用BLOCK压缩。
示例:

复制代码
create table if not exists seqfile_table(
site string,
url  string,
pv   bigint,
label string)
row format delimited
fields terminated by '\t'
stored as sequencefile;
插入数据操作:
set hive.exec.compress.output=true;  
set mapred.output.compress=true;  
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;  
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;  
SET mapred.output.compression.type=BLOCK;
insert overwrite table seqfile_table select * from textfile_table;  
复制代码

三、RCFILE
RCFILE是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。
RCFILE文件示例:

复制代码
create table if not exists rcfile_table(
site string,
url  string,
pv   bigint,
label string)
row format delimited
fields terminated by '\t'
stored as rcfile;
插入数据操作:
set hive.exec.compress.output=true;  
set mapred.output.compress=true;  
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;  
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;  
insert overwrite table rcfile_table select * from textfile_table;
复制代码

四、ORCFILE()
五、再看TEXTFILE、SEQUENCEFILE、RCFILE三种文件的存储情况:

复制代码
[hadoop@node3 ~]$ hadoop dfs -dus /user/hive/warehouse/*
hdfs://node1:19000/user/hive/warehouse/hbase_table_1    0
hdfs://node1:19000/user/hive/warehouse/hbase_table_2    0
hdfs://node1:19000/user/hive/warehouse/orcfile_table    0
hdfs://node1:19000/user/hive/warehouse/rcfile_table    102638073
hdfs://node1:19000/user/hive/warehouse/seqfile_table   112497695
hdfs://node1:19000/user/hive/warehouse/testfile_table  536799616
hdfs://node1:19000/user/hive/warehouse/textfile_table  107308067
[hadoop@node3 ~]$ hadoop dfs -ls /user/hive/warehouse/*/
-rw-r--r--   2 hadoop supergroup   51328177 2014-03-20 00:42 /user/hive/warehouse/rcfile_table/000000_0
-rw-r--r--   2 hadoop supergroup   51309896 2014-03-20 00:43 /user/hive/warehouse/rcfile_table/000001_0
-rw-r--r--   2 hadoop supergroup   56263711 2014-03-20 01:20 /user/hive/warehouse/seqfile_table/000000_0
-rw-r--r--   2 hadoop supergroup   56233984 2014-03-20 01:21 /user/hive/warehouse/seqfile_table/000001_0
-rw-r--r--   2 hadoop supergroup  536799616 2014-03-19 23:15 /user/hive/warehouse/testfile_table/weibo.txt
-rw-r--r--   2 hadoop supergroup   53659758 2014-03-19 23:24 /user/hive/warehouse/textfile_table/000000_0.gz
-rw-r--r--   2 hadoop supergroup   53648309 2014-03-19 23:26 /user/hive/warehouse/textfile_table/000001_1.gz
复制代码

总结:
相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存储方式,数据加载时性能消耗较大,但是具有较好的压缩比和查询响应。数据仓库的特点是一次写入、多次读取,因此,整体来看,RCFILE相比其余两种格式具有较明显的优势。

### 解决方案 当处理TXT文件并将其数据导入Hive时,如果遇到日期格式转换问题,可以采取以下方法来确保日期字段被正确解析和存储。 #### 使用 Hive 的内置函数进行日期格式化 在创建结构时定义合适的列类型,并利用 `DATE` 或者 `TIMESTAMP` 类型。对于不符合标准格式的日期字符串,在加载过程中可以通过 SQL 函数来进行预处理: ```sql CREATE TABLE IF NOT EXISTS my_table ( id INT, name STRING, date_col TIMESTAMP -- 定义为时间戳类型以便后续操作 ); LOAD DATA INPATH '/path/to/txtfile' INTO TABLE my_table; INSERT OVERWRITE TABLE my_table SELECT id, name, FROM_UNIXTIME(UNIX_TIMESTAMP(date_string_column,'yyyy-MM-dd')) AS date_col FROM staging_table; ``` 上述代码片段展示了如何先将原始文本中的日期串通过 `UNIX_TIMESTAMP()` 转换成 Unix 时间戳再转回可读性强的时间示形式[^1]。 #### 利用外部工具如 Pig 或 Spark 进行 ETL 处理 另一种方式是在数据进入 Hive 前就完成清洗工作。比如使用 Apache Pig 来做初步的数据变换: ```piglatin REGISTER 'dateutil.jar'; /* 注册自定义 UDF */ A = LOAD '/path/to/txtfile' USING PigStorage('\t') AS (f1:int,f2:chararray,date_str:chararray); B = FOREACH A GENERATE f1, f2, DateUtil.parseDateStrToDateObj(date_str); /* 应用了注册过的UDF */ STORE B INTO '/processed_data'; ``` 接着就可以把经过加工后的 `/processed_data` 文件夹作为输入源给 Hive 了[^2]。 #### 自动化流程集成 为了简化整个过程,还可以考虑采用图形界面开发环境(例如 Talend Open Studio),它允许用户拖拽组件构建复杂的工作流而无需编写大量代码。具体来说就是按照如下顺序设置任务链路:读取 HDFS 上的 TXT 文件 -> 执行 SQL 脚本来创建目标 Hive -> 将转换好的记录写入新建立的目标内[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值