大数据技术架构(组件)18——Hive:FileFormats(1)

news2025/1/16 8:05:32

1.5、FileFormats

1.5.1、FileFormat

对比:

1.5.1.1、Text File

每一行都是一条记录,每行都以换行符(\ n)结尾。数据不做压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。

缺点:

1、磁盘开销大

2、解析不方便,如JSON/Xml,比二进制格式解析更消耗资源

3、不具备类型和模式,如数值或者日期类型的数据,无法使用mr排序,需要转换为有模式的二进制文件。

1.5.1.2、SequenceFile

Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。每个Key-Value被看作是一条记录,支持三种压缩选择:NONE, RECORD, BLOCK。 Record压缩率低,一般建议使用BLOCK压缩。

缺点:

1、不支持append操作,序列化后存储的kv数据不是按照key的某个顺序存储的。

2、需要合并文件,且合并后不方便查看

优点:

1、可切分

2、难度低,因为是Hadoop框架提供的API,所以业务侧修改比较简单。

1.5.1.3、RCFile

行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block,那么一个块上可能存在多个行组。其次,块数据列式存储,有利于数据压缩和快速的列存取。

一个行组包括三个部分。第一部分是行组头部的同步标识,主要用于分隔HDFS块中的两个连续行组;第二部分是行组的元数据头部,用 于存储行组单元的信息,包括行组中的记录数、每个列的字节数、列中每个域的字节数;第三部分是表格数据段,即实际的列存储数据。 在该部分中,同一列的所有域顺序存储。从图可以看出,首先存储了列A的所有域,然后存储列B的所有域等。

注意:

1、采用先水平划分、再垂直划分的思想。

2、RCFile对于重复的数据不会重复压缩,大大节约了存储空间。

3、RCFile默认的行组大小是4MB。

1.5.1.4、Avro Files

Avro是一个基于二进制数据传输高性能的中间件。在Hadoop的其他项目中例如HBase(Ref)和Hive(Ref)的Client端与服务端的数据传输 也采用了这个工具。Avro是一个数据序列化的系统。Avro 可以将数据结构或对象转化成便于存储或传输的格式。Avro设计之初就用来支 持数据密集型应用,适合于远程或本地大规模数据的存储和交换。

Avro的数据格式总是以易于处理的形式存储数据结构与数据。Avro可以在运行时使用这些定义以通用的方式向应用程序呈现数据,而不 是需要代码生成。

代码生成在Avro中是可选的。它在一些编程语言有时使用特定的数据结构,对应于经常序列化的数据类型是非常好用的。但是在像Pig和 Hive这样的脚本系统中,代码生成将是一种负担,所以Avro不需要它。

存储全部的数据结构定义和数据的另外一个优势是允许数据被更快更简洁的写入。Protocol Buffere 为数据添加注解,因此即使定义和数 据不完全匹配,数据仍有可能被处理。然而这些注释使得数据更大和更慢的被处理。Avro不需要这些注释,使得Avro数据比其他序列化 系统更小和更快地处理。

注意:不支持通过CTAS语法写入Avro文件,必须要先有Schema。

CREATE TABLE kst
    PARTITIONED BY (ds string)
    ROW FORMAT SERDE
    'org.apache.hadoop.hive.serde2.avro.AvroserDe'
    STORED AS INPUTFORMAT
    'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
    OUTPUTFORMAT
    'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
    TBLPROPERTIES (
    'avro.schema.url'='http://schema provider/kst.avsc');

-- hive9.14之后写法
CREATE TABLE kst (
    string1 string,
    string2 string,
    int1 int,
    boolean1 boolean,
    long1 bigint,
    float1 float,
    double1 double,
    inner_record1 struct<int in inner_recordl:int,string in inner recordl:string>,
    enum1 string,
    arrayl array<string>,
    map1 map<string,string>,
    union1 uniontype<float boolean ,string>,
    fixed1 binary,
    null1 void,
    unionnullint int,
    bytes1 binary)
PARTITIONED BY (ds string)
STORED AS AVRO;

1.5.1.5、ORC (Optimized Row Columnar) Files

高效的行列存储格式。使用ORC格式,在读写方面性能都会有很大的提升。在一定程度上扩展了RCFile,并进行了优化(主要在压缩编码、查询性能方面)。相对于RCFile格式,ORC好处如下:

1、单个文件作为每个任务的输出,降低了 NameNode 的负载

2、支持Hive类型中的 datetime, decimal和复杂类型(List,Map,Struct)

3、文件存储采用了轻量级索引(稀疏索引,默认是跳过10000行)。

4、基于数据类型的块模式压缩

5、使用独立的RecordReaders并发读取同一个文件

6、无需扫描标记就可以拆分文件

7、限制读取或写入所需的内存量

8、使用协议缓冲区存储的元数据,允许添加和删除字段

存储结构:

注意点:

1、Stripes默认大小是250MB.

2、File Footer包含这个文件的strips列表以及每个stripe中的行数和列类型。包含列级别的聚合计数,如sum/count/max/min

3、Stripe footer包含文件目录信息。

4、Index data包含每列的最大值和最小值。以及每列所在的行位置(还包括Bloom Filter和位字段)

三种指定文件类型

--1、参数指定
SET hive.default.fileformat=Orc;
--2、创建表时指定
CREATE TABLE ... STORED AS ORC
--3、修改表存储类型
ALTER TABLE ...[PARTITION partition_spec] SET FILEFORMAT ORC

1.5.1.6、Parquet

基于Dremel数据模型算法实现的,即“record shredding and assembly algorithm”,面向列的二进制文件格式,不能直接读取。Parquet对于大型查询的类型是高效的。对于扫描特定表格中的特定列的查询,Parquet特别有用。Parquet支持压缩Snappy,gzip;目前Snappy默认。

组件交互架构:

查询引擎:Hive,Impala,Pg,Presto,Drill,HAWQ

计算框架:MR,Spark,Crunch,Kite,Cascading

数据模型:Avro,Thrif,Protocol Buffers,POJOS

数据模型:

支持嵌套数据模型,每个模型的Schema(可以理解为树结构)包含多个字段,每个字段由可以包含多个字段,每个字段有三个属性:重复数、类型、字段名

1、重复数:required(出现1次),repeated(出现0次或多次),optional(出现0次或1次)

2、类型:group(复杂类型),primitive(基本类型)

Parquet文件格式:

parquet文件由一个文件头(header),紧随一个或多个文件块(block),以及一个结尾文件(footer)构成。

1、文件头header包括每个文件块存储一个行组,一个行组的大小通常是一个块的大小,这个一个mapper就可以处理一个行组,增大任务执行度。

2、行组由列块构成,每个列块存储一个列的数据。

3、每个列块中的数据以页为单位,页是最小为编码单位,不同页可能用不用的编码方式。

4、parquet文件存在三种不同页:数据页、字典页、索引页

4.1、数据页用来存储当前行组中该列的值

4.2、字典页存储该列值的编码字典,每个列块最多包含一个字典页

4.3、索引页存储当前行组下列的索引。

5、parquet文件格式对于谓词下推的优化方法在于对每个行组中的每个列块,在存储的时候都会去计算对应的统计信息,比如列块的最大值、最小值和空值个数,通过这些信息可以判断该行组是否需要扫描;同时也引入了布隆过滤器以及索引等优化手段。

Metadata文件格式:

文件首位是存储的Magic Code,用来校验是否为一个Parquet文件

和ORC对比

1、Parquet支持复杂嵌套结构

2、Parquet不支持ACID和update

3、两者压缩性能差不多

4、Parquet支持的查询引擎相对丰富些。orc和hive适配性高。

1.5.1.7、JSONFILE (Hive4.0.0+)

通过hive.default.fileformat 参数配置,默认使用的是Text file.

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

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

相关文章

Python 3 基本数据类型,包含示例演示(初学友好)

嗨害大家好鸭~ 我是小熊猫 有好好学习python吗&#xff1f; Python学习资料电子书 点击此处跳转文末名片获取 Python3 基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。 在 Python 中&#xff0c;变量就是变量…

Redis实现分布式锁

基于Redis实现分布式锁。分为单Redis节点实现和Redis集群实现。 基于单个Redis节点实现分布式锁 作为分布式锁实现过程中的共享存储系统&#xff0c;Redis可以使用键值对来保护锁变量&#xff0c;在接收和处理不同客户端发送的加锁的操作请求。 客户端A、C同时请求加锁&#…

【Linux】基本开发工具的使用-yumvimgcc/g++git

文章目录Linux 软件包管理器-yum什么是软件包window和Linux互传文件的工具: lrzszyum注意事项查看软件包注意事项如何安装软件注意事项如何卸载软件好玩的指令sl 小火车cowsay 打印一只说话的小牛boxes 打印一个ASCII的动画linux_logo 显示linux系统的logocurl http://wttr.in …

2021美赛D题艺术家思路整理

问题整理 使用influence_data数据集或其部分创建音乐影响力的&#xff08;多个&#xff09;定向网络&#xff0c;其中影响者与关注者相连。开发捕捉此网络中“音乐影响的参数”。通过创建定向影响网络的子网络来探索音乐影响力的子集。描述这个子网络。你的“音乐影响”指标在…

((蓝桥杯 刷题全集)【备战(蓝桥杯)算法竞赛-第3天】( 从头开始重新做题,记录备战竞赛路上的每一道题 )距离蓝桥杯还有64天

&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6; 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&a…

PMP知识点1

根据PMBOK和参考书籍自己总结的一些不熟悉知识点&#xff0c;当做笔记放这复习。 1. 项目战略管理、组合管理、项目及管理、项目管理区别 战略管理项目组合管理项目集管理项目管理工作内容明确组织战略目标选择有利于实现战略目标的项目分析并利用各项目之间有机联系规范有序…

RAS《Research on Offense and Defense of DDos Based on Evolutionar Game Theory》

Read abstract and personal Summary of《Research on Offense and Defense of DDos Based on Evolutionar Game Theory》Ⅰ&#xff1a;Read abstract(阅读摘要)0&#xff1a;Proper noun interpretation&#xff08;专有名词解释&#xff09;1&#xff1a;The question raise…

windows 休眠后风扇狂转的解决方法

windows 休眠后风扇狂转的解决方法 问题描述&#xff1a; 在Windows电脑接入usb设备后进入休眠状态时&#xff0c;风扇立刻最大功率运行&#xff0c;在拔出usb/唤醒电脑后风扇会恢复正常。 解决方法&#xff1a; 使用powercfg 查询唤醒电脑的设备&#xff0c;然后移除此设备…

C语言基础(五)—— 数组、数组地址(步长+1)、字符串输入输出、随机数

1. 概述在程序设计中&#xff0c;为了方便处理数据把具有相同类型的若干变量按有序形式组织起来——称为数组。数组就是在内存中连续的相同类型的变量空间。同一个数组所有的成员都是相同的数据类型&#xff0c;同时所有的成员在内存中的地址是连续的。数组属于构造数据类型&am…

从Manifold到SNE再到t-SNE再回到Manifold

在介绍t-SNE之前&#xff0c;要从流形开始讲起。 流形Manifold 将流形引入到机器学习领域主要有两个用途&#xff1a; 改进原本欧式空间中的算法&#xff0c;使它能作用到流形上&#xff0c;直接或者间接地利用和流行的性质和构造。将流形映射到欧式空间中&#xff0c;令欧式…

软件测试面试:年后就拿到了5个offer,希望也能助你拿下满意的offer

求职&#xff0c;就像打仗&#xff0c;不仅是一场挑战自己的战斗&#xff0c;也是一场与用人单位的较量。 而求职者只有准备足够充分&#xff0c;才能在这场毫无硝烟的“战场”上取得胜利。 那么软件测试面试需要做哪些准备以及软件测试面试需要哪些技巧呢&#xff1f; 1、熟…

ThreadLocal 适合用在哪些实际生产的场景中?

在通常的业务开发中&#xff0c;ThreadLocal有两种典型的使用场景 场景1&#xff0c;ThreadLocal 用作保存每个线程独享的对象&#xff0c;为每个线程都创建一个副本&#xff0c;这样每个线程都可以修改自己所拥有的副本, 而不会影响其他线程的副本&#xff0c;确保线程安全 …

【内网安全-隧道搭建】内网穿透_Frp上线、测试

目录 Frp&#xff08;简易上线&#xff09; 1、简述&#xff1a; 2、工具&#xff1a; 3、使用&#xff1a; 1、准备&#xff1a; 2、服务端&#xff08;公网&#xff09;&#xff1a; 2、客户端&#xff08;内网&#xff09;&#xff1a; 3、测试方法&#xff1a; 4、…

【Linux】基础IO --- 软硬链接、acm时间、动静态库制作、动静态链接、动静态库加载原理…

我用执着烧死了所有的幼稚和任性&#xff0c;那片荒野慢慢长出了理智冷漠和清醒。 文章目录一、软硬链接1.软硬链接的区别&#xff08;是否具有独立的inode&#xff09;2.软硬链接的作用2.1 软链接作用&#xff08;建立快捷方式&#xff09;2.2 硬链接作用&#xff08;防止误删…

PLC信号处理系列之滤波器设计(MATLAB滤波器设计工具箱介绍)

在学习和应用滤波器解决工程问题之前,需要了解一定的信号处理相关基础知识,有关信号和系统的学习笔记可以参看下面的专栏: https://blog.csdn.net/m0_46143730/article/details/128788864https://blog.csdn.net/m0_46143730/article/details/128788864命令行窗口输入>&g…

排序模型进阶-FTRL

5.8 排序模型进阶-FTRL 学习目标 目标 无应用 无 5.8.1 问题 在实际项目的时候&#xff0c;经常会遇到训练数据非常大导致一些算法实际上不能操作的问题。比如在推荐行业中&#xff0c;因为DSP的请求数据量特别大&#xff0c;一个星期的数据往往有上百G&#xff0c;这种级别…

combit Report Server 28

combit Report Server 28 Added Microsoft SharePoint Online task action.Added support for PostgreSQL 15.Added support for Microsoft SQL Server 2022.Added new option to Microsoft Excel export template. Converting texts starting with “” into Excel formula.Im…

力扣:除自身以外数字的乘积(详解)

前言&#xff1a;本期是关于除自身以外数字的乘积的详解&#xff0c;内容包括四大模块&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读&#xff0c;今天你c了吗&#xff1f; 题目&#xff1a; 给你一个整数数组 nums&#xff0c;返回 数组 ans…

【javaEE】文件

目录 文件概念 文件路径 绝对路径 相对路径 文件类型 文本文件 二进制文件 Java中对文件的操作 对文件系统的操作 get相关方法 文件类型判断和创建 文件删除 文件目录的创建 文件重命名 对文件内容的操作 字符流(操作字符数据) 代码例子 删除文件 复制文件 …

算法刷题-求素数、数据流的中位数、不同的二叉搜索树

求素数、数据流的中位数、不同的二叉搜索树求素数数据流的中位数不同的二叉搜索树求素数 求1-100内的素数&#xff1a; public static void main(String[] args){for(int i0;i<100;i) {checkPrime(i);}}private static void checkPrime(int x){boolean isPrime true;if(x…