6、hive中的file_format

本文深入探讨Hive中的不同数据存储格式,包括TextFile、SequenceFile、RCFile、ORC和Parquet,分析各自的优缺点及应用场景。通过具体实例,如创建表、加载数据、压缩设置等操作,对比不同格式的性能表现。

行存储和列存储在hdfs中的区别

7552712af1180fa442d5af31ca81706568a.jpg

hive中的file_format

可以使用set hive.default.fileformat来查看和设置格式
set hive.default.fileformat
默认是TextFile

file_format:【查看hive官方文档】
  : SEQUENCEFILE 【文件比原始文本文件还要大;不适用】
  | TEXTFILE    -- (Default, depending on hive.default.fileformat configuration)
  | RCFILE      -- (Note: Available in Hive 0.6.0 and later)【性能也比较低;减少百分之10空间】
  | ORC         -- (Note: Available in Hive 0.11.0 and later)
  | PARQUET     -- (Note: Available in Hive 0.13.0 and later)

准备测试数据

949a075075a07810c703a0c98b5d71c2e1b.jpg

 

创建表

create table page_views(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
) row format delimited fields terminated by '\t';

加载数据

load data inpath '/input/hive_test/page_views.dat' into table page_views;

插入知识点:hive的四种导入方式

本地导入:load data local inpath '本地路径' into table 表名;
hdfs导入:load data inpath 'hdfs路径' into table 表名;
直接导入:[表已存在]从别的表中查询出相应的数据并导入到Hive表中
创建导入:【表未存在】在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中

450169d78388943fd1d6718fdf0db43c570.jpg

SET hive.exec.compress.output=true;【设置输出压缩为true】
set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.Bzip2Codec;【map的xml已经配置;这里无需指定】
create table page_views_bzip2
as select * from page_views;

69672a5977e0f70bb8935b8ddd765d5ae3c.jpg

即可完成page_views_bzip2表的创建;同时查看此表的文件是bzip压缩格式

源文件

10032cc378989ff5edda7492784de4b5c4c.jpg

下列语句是测试hive的file_format

create table page_views_sequencefile(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
) row format delimited fields terminated by '\t'
stored as sequencefile

不能用load直接导入数据
需要select * from其他的表数据导入本表
sequencefile一般不会用;因为它比原始数据还要大

orc格式 默认ZLIB压缩

create table page_views_orc(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
) row format delimited fields terminated by '\t'
stored as orc【指定格式 比如sequencefile,orc等等】 ;

44c02ea6ca72486340a7d84ca04ef2d57ec.jpg
717501921631c80377a794caf4fb0cd999c.jpg

orc不采用压缩

hive orc官网:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC

【默认情况下"orc.compress"="ZLIB"

create table page_views_orc_none
stored as orc tblproperties ("orc.compress"="NONE") 【不采用默认压缩】
as select * from page_views;

60acf9a427ec6dfc54fc6a6136ff6378c64.jpg

parquet不使用压缩

官网:https://github.com/apache/parquet-mr

 create table page_views_parquet 
 stored as parquet 
 as select * from page_views;

607aa9c39276223abbcc4463b4734d7fa7a.jpg

parquet使用gzip压缩

set parquet.compression=gzip;
 create table page_views_parquet_gzip
 stored as parquet 
 as select * from page_views;

fe8e7572b85d633a6f49e17424f3991e346.jpg

 

 

 

转载于:https://my.oschina.net/u/4005872/blog/3038184

### 在 Hive 中查询或生成 user_logs 数据的方法 在 Hive 中操作 `user_logs` 数据通常涉及创建表、加载数据以及执行查询等操作。以下是具体方法和相关说明: #### 1. 创建表 如果尚未创建 `user_logs` 表,可以使用以下 SQL 语句来定义表结构[^3]: ```sql CREATE TABLE IF NOT EXISTS user_logs ( user_id STRING, action_type STRING, product_id STRING, timestamp STRING ) PARTITIONED BY (date STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; ``` 上述代码中,`user_logs` 表被定义为分区表,按日期 (`date`) 进行分区,以优化查询性能。 #### 2. 加载数据 假设原始日志文件存储在 HDFS 的某个路径下(如 `/user/hadoop/raw_logs/`),可以通过以下命令将数据加载到 `user_logs` 表中[^1]: ```sql LOAD DATA INPATH '/user/hadoop/raw_logs/' INTO TABLE user_logs PARTITION(date='2023-10-01'); ``` 如果需要动态加载多个分区的数据,可以启用动态分区插入功能[^3]: ```sql SET hive.exec.dynamic.partition=true; SET hive.exec.dynamic.partition.mode=nonstrict; INSERT INTO TABLE user_logs PARTITION(date) SELECT user_id, action_type, product_id, timestamp, SUBSTR(timestamp, 1, 10) AS date FROM raw_logs_table; ``` #### 3. 查询数据 查询 `user_logs` 表中的数据时,可以根据需求选择不同的查询方式。例如,统计某一天的用户访问量: ```sql SELECT COUNT(DISTINCT user_id) AS unique_users FROM user_logs WHERE date = '2023-10-01'; ``` 需要注意的是,在某些情况下(如日志中存在大量重复的 `user_id`),可能会导致数据倾斜问题[^4]。为了避免这种情况,可以采用以下方法优化查询: ```sql SELECT COUNT(DISTINCT CONCAT(user_id, MOD(HASH(user_id), 10))) AS unique_users FROM user_logs WHERE date = '2023-10-01'; ``` 通过引入 `MOD(HASH(user_id), 10)`,可以分散重复的 `user_id`,从而缓解数据倾斜问题。 #### 4. 日志存储与管理 为了确保 Hive 日志的安全性和可维护性,建议将日志存储路径从默认的 `/tmp/atguigu/hive.log` 更改为自定义路径(如 `/opt/module/hive/logs`)[^2]。可以通过修改 `hive-log4j.properties` 文件实现这一目标: ```bash [atguigu@hadoop102 conf]$ cp hive-log4j.properties.template hive-log4j.properties ``` 编辑 `hive-log4j.properties` 文件,将日志路径更改为: ```properties log4j.appender.DRFA.File=/opt/module/hive/logs/hive.log ``` ### 示例代码 以下是一个完整的示例,展示如何从原始日志生成 `user_logs` 表并查询数据: ```sql -- 创建表 CREATE TABLE IF NOT EXISTS user_logs ( user_id STRING, action_type STRING, product_id STRING, timestamp STRING ) PARTITIONED BY (date STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; -- 启用动态分区 SET hive.exec.dynamic.partition=true; SET hive.exec.dynamic.partition.mode=nonstrict; -- 插入数据 INSERT INTO TABLE user_logs PARTITION(date) SELECT user_id, action_type, product_id, timestamp, SUBSTR(timestamp, 1, 10) AS date FROM raw_logs_table; -- 查询数据 SELECT COUNT(DISTINCT CONCAT(user_id, MOD(HASH(user_id), 10))) AS unique_users FROM user_logs WHERE date = '2023-10-01'; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值