hive之文件格式与压缩

news2024/11/24 7:27:34

hive文件格式:

概述:

  为Hive表中的数据选择一个合适的文件格式,对提高查询性能的提高是十分有益的。Hive表数据的存储格式,可以选择text file、orc、parquet、sequence file等。

文本文件:

文本文件就是txt文件,我们默认的文件类型就是txt文件

ORC文件:

ORC介绍:

  ORC(Optimized Row Columnar)file format是Hive 0.11版里引入的一种列式存储的文件格式。ORC文件能够提高Hive读写数据和处理数据的性能。

我们文件一般都是一个二维表,行式存储就是以一行数据为一个单位,存储在相邻的位置,列示存储是以一列数据为单位,一个单位内的数据放在相邻的位置。

如下图两种方式的比较:

 在日常使用的时候hive查询出来的大部分是大量列信息,少量使用where进行条件查询

orc格式在存储的过程中会在hive表上进行横向切分,分割成两次分别进行列式存储

对分割后的数据进行列式存储时,会把它存储到orc文件的一个strip(条带)中,剩下的数据存入其他条带中,条带中并不止存对应的列,还存有一个indexdata--索引(存放每列区(column)的最大值,最小值,行位置)(可以减少大量io操作)默认10000行记录一个索引。

在文件最后还存有一个StripeFooter(存放每个column的编码信息---在存入orc文件的时候并不会按照原表进行存储而是会进行编码存储)

在文件开头有一个header:ORC(可以用于判断文件类型)

文件的底部还有一个FileFooter(存储的有header的长度,各Strip的信息:strips的起始位置,索引长度,数据的长度,StripsFooter的长度等,还存储有各column的统计信息:最值,hashNull)

ORC文件还有一个PostScript,保存这FileFooter的长度,文件压缩的参数,文件的版本等信息。

还有一个区域用于保存Postscrip的长度(文件的最后一个字节)

读取ORC文件步骤:  

一般读取ORC文件是从文件末尾开始,先进行读取最后一个字节(Postscript的长度),再通过得到的长度从倒数第二个字节进行向前推到Postscript的起始位置开始读取,从Postscript的数据中的得到File Footer的长度,再进行向前推进行访问,让后就可以根据File Footer中的内容进行定位。

建表语句:

create table orc_table
(column_specs)
stored as orc
tblproperties (property_name=property_value, ...);

 column_speccs是建表语句

tblproperties (property_name=property_value, ...)是一些建表的参数

参数

默认值

说明

orc.compress

ZLIB

压缩格式,可选项:NONEZLIB,SNAPPY

orc.compress.size

262,144(256kb)

每个压缩块的大小(ORC文件是分块压缩的)

orc.stripe.size

67,108,864(64MB一般与Hadoop中的块大小一致Hadoop2.x后是128MB)

每个stripe的大小

orc.row.index.stride

10,000

索引步长(每隔多少行数据建一条索引)

 eg:

create table orc_table
(   id int,
    name string
)
stored as orc;

在导入数据的时候不能从文本文件load到orc文件(因为load其实是文件的复制,是带有格式的,在导入的时候是没有关系的,但是在读的是时候是不能正确读出的)

文本文件数据如何导入到orc格式的表中?

我们可以建立一个临时表,把文本文件中的数据导入到临时表中,通过insert+select的方式进行导入。(走计算)

Parquet文件:

Parquet文件是Hadoop生态中的一个通用的文件格式,它也是一个列式存储的文件格式。

Parquet文件也会对表进行横向切分,切分后会存入到行组中(Row Group),在行组中的数据的每个列都形成一个列块(column chunk)列块中的数据会再分为页块(page)。

最后还有Footer(File Meta Data)中存储了每个行组(Row Group)中的每个列快(Column Chunk)的元数据信息,元数据信息包含了该列的数据类型、该列的编码方式、该类的Data Page位置等信息。File Meta Data中的Row Group的数量是与上边Row Group进行一一对应的。

Parquet文件的开头与结尾都会占用4个字节进行存储   PAR1   (是Parquet的简写+版本号)

还会在下边保存Footer的长度

详细如图:

Parquet文件基本语法:

Create table parquet_table
(column_specs)
stored as parquet
tblproperties (property_name=property_value, ...);

支持的参数如下:

参数

默认值

说明

parquet.compression

uncompressed

压缩格式,可选项:uncompressedsnappygziplzobrotlilz4

parquet.block.size

134217728 (128mb)

行组大小,通常与HDFS块大小保持一致

parquet.page.size

1048576(1m)

页大小

eg:

create table parquet_table
(   id int,
    name string
)
stored as parquet ;

 压缩:

Hive表数据进行压缩:

        在Hive表中和计算过程中,保持数据的压缩,对磁盘空间的有效利用和提高查询性能都是十分有益的。

注:在Hive中,不同文件类型的表,声明数据压缩的方式是不同的。

1)TextFile

若一张表的文件类型为TextFile,若需要对该表中的数据进行压缩,多数情况下,无需在建表语句做出声明。直接将压缩后的文件导入到该表即可,Hive在查询表中数据时,可自动识别其压缩格式,进行解压。

我们怎么让我们的hive表是压缩的那?

(1)我们使用load语句,load的原表就是一个压缩的文件,可以直接进行压缩

(2)使用insert into 语句,如果使用这种方式就需要进行设置参数。

需要注意的是,在执行往表中导入数据的SQL语句时,用户需设置以下参数,来保证写入表中的数据是被压缩的。

--SQL语句的最终输出结果是否压缩
set hive.exec.compress.output=true;
--输出结果的压缩格式(以下示例为snappy)
set mapreduce.output.fileoutputformat.compress.codec =org.apache.hadoop.io.compress.SnappyCodec;

2)ORC

若一张表的文件类型为ORC,若需要对该表数据进行压缩,需在建表语句中声明压缩格式如下:

create table orc_table
(column_specs)
stored as orc
tblproperties ("orc.compress"="snappy");

3)Parquet

若一张表的文件类型为Parquet,若需要对该表数据进行压缩,需在建表语句中声明压缩格式如下:

create table orc_table
(column_specs)
stored as parquet
tblproperties ("parquet.compression"="snappy");

计算过程中使用压缩:

计算过程就是mapreduce的过程。

1)单个MR的中间结果进行压缩:

这个就是在map阶段后(shuffer)的数据进行压缩,压缩后可以 降低shuffle阶段的网络IO

参数如下:

--开启MapReduce中间数据压缩功能
set mapreduce.map.output.compress=true;
--设置MapReduce中间数据数据的压缩方式(以下示例为snappy)
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;

2)单条SQL语句的中间结果进行压缩:

这里指的是有些SQL语句是比较复杂的需要多个MR阶段,则会对两个MR之间的临时数据进行压缩

可通过以下参数进行配置:

--是否对两个MR之间的临时数据进行压缩
set hive.exec.compress.intermediate=true;
--压缩格式(以下示例为snappy)
set hive.intermediate.compression.codec= org.apache.hadoop.io.compress.SnappyCodec;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/783178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法 -- LeetCode】(025) K 个一组翻转链表

1、题目 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点…

企业服务器数据库中了360后缀勒索病毒怎么解决加密的方式有哪些

随着网络安全问题日益突出,企业服务器数据库成为黑客攻击的重要目标之一。近日,我们收到很多企业的求助,企业的服务器数据库遭到了360后缀的勒索病毒攻击,导致企业内部的许多重要数据被加密无法读取使用,严重影响了企业…

05网络模型练习题

新版MATLAB中,图论工具箱的函数进行了更换 MATLAB中文参考文档:https://ww2.mathworks.cn/help/matlab/index.html 遍历、最短路径和循环 bfsearch 广度优先图搜索 dfsearch 深度优先图搜索 shortestpath 两个单一节点之间的最短路径 shortestpathtree …

Flask 笔记

Flask 笔记 一、Flask介绍 1、学习Flask框架的原因 2020 Python 开发者调查结果显示Flask和Django是Python Web开发使用的最主要的两个框架。 2、Flask介绍 ​ Flask诞生于2010年,是Armin ronacher用Python 语言基于Werkzeug工具箱编写的轻量级Web开发框架。 ​…

企业数字化转型要转什么?怎么转?_光点科技

随着科技的飞速发展和互联网的普及,数字化转型已成为现代企业持续发展和提高竞争力的必经之路。数字化转型是指企业在信息技术的驱动下,将传统的业务模式、流程和文化进行全面优化和改造,以适应数字化时代的新要求。 一、企业数字化转型的重要…

二极管常见参数

写在前面: 本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。 目录 肖特基二极管PN…

CCLINK IE转MODBUS-TCP网关cclink与以太网的区别

你是否曾经遇到过需要同时处理CCLINK IE FIELD BASIC和MODBUS两种数据协议的情况?远创智控的YC-CCLKIE-TCP网关可以帮助你解决这个问题。 远创智控YC-CCLKIE-TCP网关可以分别从CCLINK IE FIELD BASIC一侧和MODBUS一侧读写数据,然后将数据存入各自的缓冲区…

SpringBoot整合可视化监控工具——SpringBoot Admin

目录 父项目 子模块——server 子模块——client 开放监控指标 性能 环境 日志配置 映射 问题一: 明明项目启动却还是Instance 是 office 问题二: 记springboot中yml文件最后一位是星号*的写法 在说软件监控之前,我们先来了解一下软件的发展史&#xff0c…

【字符流】案例:文件到集合

案例:文件到集合 1.需求: 把文本文件中的数据读取到集合,并遍历集合。要求:文件中的每一行数据是一个集合元素 2.思路 创建字符缓冲输入流对象创建ArrayList集合对象调用字符缓冲输入流对象的方法读数据把读取到的字符串数据存…

【Lingo软件求解案例一:MCM1988:B题两辆平板车的装货问题】

题目描述 有 七种规格的包装箱 要装到 两辆平板车 上 包装箱的宽和高是一样的 但是厚度(t 厘米)和重量(w 公斤)是不一样的 表格中给出每种包装箱的厚度、重量和数量 每辆平板车有10.2米长的地方可以用来装包装箱 像面包片一样 载…

【PostgreSQL内核学习(七)—— 查询规划(生成路径)】

查询规划——预处理 生成路径 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。 本文主要参考了《PostgresSQL数据库内核分析》一书 生…

进阶C语言——动态内存管理

好久不见,今天我们学习一下C语言的动态内存管理,这是一个和指针一样重要的章节,所以大家一定要好好学这章。 1. 为什么存在动态内存分配 我们已经掌握的内存开辟方式有: int val 20;//在栈空间上开辟四个字节 char arr[10] {0};…

Obsidian同步到Notion

插件介绍 将Obsidian的内容同步到Notion需要使用一个第三方插件"Obsidian shared to Notion"EasyChris/obsidian-to-notion: Share obsidian markdown file to notion and generate notion share link 同步obsdian文件到notion,并生成notion分享链接&am…

数据仓库表设计理论

数据仓库表设计理论 数仓顾名思义是数据仓库,其数据来源大多来自于业务数据(例如:关系型数据库),当设计数仓中表类型时(拉链表、增量表、全量表、流水表、切片表)时,应先观察业务数据的特点再设计数仓表结构 首先业务数据是会不断增长的-即…

flask介绍、快速使用、配置文件、路由系统

前言: Flask框架和Django框架的区别: Django框架: 大而全,内置的app的很多,第三方app也很多Flask框架: 小而精,没有过多的内置app,只能完成web框架的基本功能,很多功能都需要借助第三…

护城河理论

护城河理论 护城河理论|来自股神巴菲特,是指投资的企业在某一方面的核心竞争力。 模型介绍 在2000年的伯克希尔哈撒韦的年会上,巴菲特说:让我们来把护城河作为一个伟大企业的首要标准,保持它的宽度,保持它不被跨越。我…

【字符流】案例:集合到文件

案例:集合到文件 1.需求: 把ArrayList集合中的字符串数据写入到文本文件。要求:每一个字符串元素作为文件中的一行数据 2.思路 创建ArrayList集合往集合中存储字符串元素创建字符缓冲输出流对象遍历集合,得到每一个字符串数据调…

『Dubbo SPI源码分析』依赖注入机制分析

Dubbo Wrapper 依赖注入机制分析 基于 2.7.0 版本上一章:『Dubbo SPI源码分析』Wrapper 机制分析 创建测试 demo 首先创建一个接口,举例为 Car package com.luban.dubbo_spi.api;SPI public interface Car {public void getColor();public void getC…

数据结构(王道)——数据结构之 由遍历序列构造二叉树

结论:给出遍历序列当中的一种,不能唯一确定一颗二叉树。