orc文件存储格式

ORC文件也是以二进制方式列式存储的,所以是不可以直接读取,ORC文件也是自解析的,它包含许多的元数据,这些元数据都是同构ProtoBuffer进行序列化的。文件结构如下

ORC文件:保存在文件系统上的普通二进制文件,一个ORC文件中可以包含多个stripe,每一个stripe包含多条记录,这些记录按照列进行独立存储,对应到Parquet中的row group的概念。

文件级元数据:包括文件的描述信息PostScript、文件meta信息(包括整个文件的统计信息)、所有stripe的信息和文件schema信息。

stripe:一组行形成一个stripe,每次读取文件是以行组为单位的,一般为HDFS的块大小,保存了每一列的索引和数据。

stripe元数据:保存stripe的位置、每一个列的在该stripe的统计信息以及所有的stream类型和位置。

row group:索引的最小单位,一个stripe中包含多个row group,默认为10000个值组成。

stream:一个stream表示文件中一段有效的数据,包括索引和数据两类。索引stream保存每一个row group的位置和统计信息,数据stream包括多种类型的数据,具体需要哪几种是由该列类型和编码方式决定。

create table if not exists orctest(

name string,

age int

)

stored AS orc tblproperties("orc.compress" = "snappy");

Orcfile指定TBLPROPERTIES (“orc.compress”=“ZLIB”) or (“orc.compress”=“SNAPPY”) or (“orc.compress”=“NONE”) and other ORC properties

hive中orc存储对数据的update依靠的是orc的特性,而不是hive的特性

orc存储格式不支持load data local inpath方式加载数据,只能从textfile中select数据insert 到orc表中

ORC文件使用两级压缩机制,首先将一个数据流使用流式编码器进行编码,然后使用一个可选的压缩器对数据流进行进一步压缩。 一个column可能保存在一个或多个数据流中.

parquet文件存储格式

Parquet文件是以二进制方式列式存储的,所以是不可以直接读取的,文件中包括该文件的数据和元数据,因此Parquet格式文件是自解析的。在HDFS文件系统和Parquet文件中存在如下几个概念。

HDFS块(Block):它是HDFS上的最小的副本单位,HDFS会把一个Block存储在本地的一个文件并且维护分散在不同的机器上的多个副本,通常情况下一个Block的大小为256M、512M等。

HDFS文件(File):一个HDFS的文件,包括数据和元数据,数据分散存储在多个Block中。

行组(Row Group):按照行将数据物理上划分为多个单元,每一个行组包含一定的行数,在一个HDFS文件中至少存储一个行组,Parquet读写的时候会将整个行组缓存在内存中,所以如果每一个行组的大小是由内存大的小决定的,例如记录占用空间比较小的Schema可以在每一个行组中存储更多的行。

列块(Column Chunk):在一个行组中每一列保存在一个列块中,行组中的所有列连续的存储在这个行组文件中。一个列块中的值都是相同类型的,不同的列块可能使用不同的算法进行压缩。

页(Page):每一个列块划分为多个页,一个页是最小的编码的单位,在同一个列块的不同页可能使用不同的编码方式。

create table if not exists parquettest(

name string,

age int

)

ROW FORMAT SERDE 'parquet.hive.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT "parquet.hive.DeprecatedParquetInputFormat" OUTPUTFORMAT "parquet.hive.DeprecatedParquetOutputFormat";

不需要建表指定压缩方式,插入数据之前set parquet.compression=SNAPPY 或set parquet.compression=GZIP

映射下推

说到列式存储的优势,映射下推是最突出的,它意味着在获取表中原始数据时只需要扫描查询中需要的列,由于每一列的所有值都是连续存储的,所以分区取出每一列的所有值就可以实现TableScan算子,而避免扫描整个表文件内容。

在Parquet中原生就支持映射下推,执行查询的时候可以通过Configuration传递需要读取的列的信息,这些列必须是Schema的子集,映射每次会扫描一个Row Group的数据,然后一次性得将该Row Group里所有需要的列的Cloumn Chunk都读取到内存中,每次读取一个Row Group的数据能够大大降低随机读的次数,除此之外,Parquet在读取的时候会考虑列是否连续,如果某些需要的列是存储位置是连续的,那么一次读操作就可以把多个列的数据读取到内存。

谓词下推

在数据库之类的查询系统中最常用的优化手段就是谓词下推了,通过将一些过滤条件尽可能的在最底层执行可以减少每一层交互的数据量,从而提升性能,例如”select count(1) from A Join B on A.id = B.id where A.a > 10 and B.b < 100”SQL查询中,在处理Join操作之前需要首先对A和B执行TableScan操作,然后再进行Join,再执行过滤,最后计算聚合函数返回,但是如果把过滤条件A.a > 10和B.b < 100分别移到A表的TableScan和B表的TableScan的时候执行,可以大大降低Join操作的输入数据。

无论是行式存储还是列式存储,都可以在将过滤条件在读取一条记录之后执行以判断该记录是否需要返回给调用者,在Parquet做了更进一步的优化,优化的方法时对每一个Row Group的每一个Column Chunk在存储的时候都计算对应的统计信息,包括该Column Chunk的最大值、最小值和空值个数。通过这些统计值和该列的过滤条件可以判断该Row Group是否需要扫描。另外Parquet未来还会增加诸如Bloom Filter和Index等优化数据,更加有效的完成谓词下推。

在使用Parquet的时候可以通过如下两种策略提升查询性能:1、类似于关系数据库的主键,对需要频繁过滤的列设置为有序的,这样在导入数据的时候会根据该列的顺序存储数据,这样可以最大化的利用最大值、最小值实现谓词下推。2、减小行组大小和页大小,这样增加跳过整个行组的可能性,但是此时需要权衡由于压缩和编码效率下降带来的I/O负载。

avro文件存储格式

Avro依赖模式(Schema)来实现数据结构定义。可以把模式理解为Java的类,它定义每个实例的结构,可以包含哪些属性。可以根据类来产生任意多个实例对象。对实例序列化操作时必须需要知道它的基本结构,也就需要参考类的信息。这里,根据模式产生的Avro对象类似于类的实例对象。每次序列化/反序列化时都需要知道模式的具体结构。所以,在Avro可用的一些场景下,如文件存储或是网络通信,都需要模式与数据同时存在

Avro的模式主要由JSON对象来表示,它可能会有一些特定的属性,用来描述某种类型(Type)的不同形式。Avro支持八种基本类型(Primitive Type)和六种混合类型(Complex Type)。基本类型可以由JSON字符串来表示。每种不同的混合类型有不同的属性(Attribute)来定义,有些属性是必须的,有些是可选的,如果需要的话,可以用JSON数组来存放多个JSON对象定义。在这几种Avro定义的类型的支持下,可以由用户来创造出丰富的数据结构来,支持用户纷繁复杂的数据。

Avro支持两种序列化编码方式:二进制编码和JSON编码。使用二进制编码会高效序列化,并且序列化后得到的结果会比较小;而JSON一般用于调试系统或是基于WEB的应用。对Avro数据序列化/反序列化时都需要对模式以深度优先(Depth-First),从左到右(Left-to-Right)的遍历顺序来执行。基本类型的序列化容易解决,混合类型的序列化会有很多不同规则。对于基本类型和混合类型的二进制编码在文档中规定,按照模式的解析顺序依次排列字节。对于JSON编码,联合类型(Union Type)就与其它混合类型表现不一致。

Avro为了便于MapReduce的处理定义了一种容器文件格式(Container File Format)。这样的文件中只能有一种模式,所有需要存入这个文件的对象都需要按照这种模式以二进制编码的形式写入。对象在文件中以块(Block)来组织,并且这些对象都是可以被压缩的。块和块之间会存在同步标记符(Synchronization Marker),以便MapReduce方便地切割文件用于处理。

create table if not exists avrotest(

name string,

age int

)

stored AS avro;

或者

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');

高版本的hive,可以直接使用avro格式存储,而不需要手动指定avro的schema文件,hive自己会根据table的创建方式自行解析并将schema存储到文件的头部

parquet,avro,orc存储格式对比

相同点

基于Hadoop文件系统优化出的存储结构

提供高效的压缩

二进制存储格式

文件可分割,具有很强的伸缩性和并行处理能力

使用schema进行自我描述

属于线上格式,可以在Hadoop节点之间传递数据

不同点

1.行式存储or列式存储:Parquet和ORC都以列的形式存储数据,而Avro以基于行的格式存储数据。 就其本质而言,面向列的数据存储针对读取繁重的分析工作负载进行了优化,而基于行的数据库最适合于大量写入的事务性工作负载。

2.压缩率:基于列的存储区Parquet和ORC提供的压缩率高于基于行的Avro格式。

3.可兼容的平台:ORC常用于Hive、Presto;Parquet常用于Impala、Drill、Spark、Arrow;Avro常用于Kafka、Druid。

ORC、Parquet的列式存储格式的优势

1、更高的压缩比,由于相同类型的数据更容易针对不同类型的列使用高效的编码和压缩方式。

2、更小的I/O操作,由于映射下推和谓词下推的使用,可以减少一大部分不必要的数据扫描,

尤其是表结构比较庞大的时候更加明显,由此也能够带来更好的查询性能

linux怎么看文件是否orc格式,hive文件存储格式orc,parquet,avro对比相关推荐

  1. linux 解压rar格式的文件怎么打开,linux服务器怎么解压rar格式的文件

    做seo的很多人都会经历过这个问题,那就是安装的宝塔.wdcp等面板后,但是在上传完压缩文件的时候,发现压缩文件是rar后缀的压缩文件,在宝塔面板中就解压不了rar文件. 一.于是就想着把后缀改为zi ...

  2. python获取文件夹里有什么文件+查看特定格式的文件

    python获取文件夹里有什么文件+查看特定格式的文件 功能 程序 效果 后续 功能 获取文件夹的的文件+获取文件夹里的特定格式的文件,比如.png等 程序 import os folder = r& ...

  3. shell处理 [批次号][分隔符][文件名称].[后缀] 格式的文件

    shell处理[批次号][分隔符][文件名称].[后缀]格式的文件 总是有那种坑数据,需要我们处理一下. 示例问题格式如下: shell处理[批次号][分隔符][文件名称].[后缀]格式的文件,将一个 ...

  4. java 文件遍历排序_Java的二叉树排序以及遍历文件展示文本格式的文件树

    Java二叉树排序算法排序二叉树的描述也是一个递归的描述, 所以排序二叉树的构造自然也用递归的: 排序二叉树的3个特征: 1:当前node的所有左孩子的值都小于当前node的值: 2:当前node的所 ...

  5. python读取oracle数据到hvie parquet_创建Hive表来从parquet / avro模式读取parquet文件

    We are looking for a solution in order to create an external hive table to read data from parquet fi ...

  6. html文件转换html格式,pdf文件怎么转换成html格式

    PDF文件怎么转换成html格式呢?html格式其实就是网页格式,PDF文件和网页文件一般情况下是两种完全不搭边的格式,但是不可否定的是办公室的多样化总有人会有这样的需求,只要有需求就会有其相应的解决 ...

  7. eml文件是什么格式的文件?怎么打开?怎么导出eml文件?

     eml格式文件是一个电子邮件文件,其格式名由来是E-mail(电子邮件)的缩写形式. 一个eml文件打开后就是一封电子邮件(E-mail),它是电子邮件导出后的格式,163.QQ等使用较多的邮件 ...

  8. 如何在linux下解压缩rar和zip格式的文件压缩包

    转载:http://oldboy.blog.51cto.com/2561410/597515 使用apt-get安装:  sudo apt-get install  rar  zip rar使用: 将 ...

  9. Linux要怎么解压sig格式的文件,sig文件扩展名,sig文件怎么打开?

    .sig 文件类型1:Broderbund Sign File 文件说明:Image format used for signs and posters created with Broderbund ...

最新文章

  1. 自动机器学习:团队如何在自动学习项目中一起工作?(附链接)
  2. 在大厂干了几年开发后,太真实了。
  3. 大数据玩家们对2013年趋势的预测
  4. 用LIBSVM做回归和预测
  5. 并联串联混合的电压和电流_串、并联电路中的电流与电压规律
  6. inline-block 和 float 的区别
  7. dynamodb容器使用_使用DynamoDBMapper扫描DynamoDB项目
  8. python zipfile setpassword_Python模块:zipfile
  9. Linux 主机超全渗透测试命令汇总
  10. 解读年度数据库性能:PostgreSQL的日志文件和数据加载
  11. 【目标检测】FPN(Fature Pyramid Network)详解
  12. 初二物理模型有哪些_老师整理的初二学习方法!自己看完转给孩子看
  13. 2020年市场最缺什么_2020年资本市场回顾
  14. 背靠福特的Argo无人车发生严重事故,两名乘客已送往医院
  15. Java从入门到精通07-排序
  16. pytorch tensor操作:tensor与numpy转换
  17. Iterm2 配置(不断更新)
  18. Prometheus+Grafana监控系统部署与使用
  19. 0x和\u区别,unicode编码
  20. [BZOJ]4198 [NOI2015] 荷马史诗 哈夫曼树

热门文章

  1. matlab eps是什么
  2. flink在k8s上的部署和使用教程
  3. python分布式多进程框架 Ray
  4. TextSnake文本检测
  5. 串的复制——串传送指令MOVSB和方向标志位DF和CLD和REP
  6. python基本定制之__new__, __init__
  7. 行为驱动开发BDD和Cucunber简介
  8. 第6次结对作业--郑锦伟古维城
  9. 最新的 iOS 申请证书与发布流程
  10. 1.Web前端之CSS3中3D立方体以及3D轮播图