parquet

news2024/11/18 9:23:17

一、parquet结构

在这里插入图片描述

Row Group

​ --Column Chunk:一列对应一个Column Chunk

​ – Page:压缩和编码的单元,parquet的 min/max 索引是针对于page的,存在了文件的页脚。以前的版本是存储Column Chunk和Page的索引,导致在决定是否跳过的时候,都必须读取Page的头文件来决定。

对比orc索引,感觉更优秀

数据编码和orc很像,就不细说了

二、parquet对于嵌套数据类型的处理

2.1 数据模型(数据定义时候用的)

parquet处理嵌套数据的思路来源于Google的Dremel系统(Dremel是Google研发的一个即席查询系统,因为Google处理的数据一般都是网页数据,会有很多嵌套类型,下文把这种数据存储方式简称为Dremel)。

parquet不需要复杂类型,如Map、List或Set,因为它们可以映射到repeated fields 和 groups的组合。

Dremel支持的数据类型:group 和 原子数据类型 (int, float, boolean, string)

Dremel根据数据的出现次数把数据分成了三种类型:

  • required:出现且仅出现一次
  • optional:出现0次或1次
  • repeated:出现0次或多次

例:

在这里插入图片描述

2.2 存储(数据存储时候用的)

为了把数据可以组装到一起,定义两个存储级别:Repetition levels 和 Definition levels,如 Fig3

Repetition levels:表示值在字段路径中有几个重复。作用是为了解析非null字段。

如上述示例,Name.Language.Code路径中有两个重复字段,Name和Language,因此Code的重复级别范围是0~2(Name:1,Language:2),0表示新的记录开始。

如果从上往下扫描r1和r2的数据,'en-us’是一个新的Code,所以它的r level是0,'en’是在Language中重复,所以它的 r level是2,

'en-gb’是在Name中重复的,在这个Name中没有重复的Language,所以它的 r level是1。

Definition levels:表示有多少个字段可能未定义(因为它们是可选的或重复的)。作用是为了处理null。

如上述示例,DocId是required,所以它的d level是0;conntry的d level范围是1~3,如果有d level < 3,表示该country是null。

2.3 实现List和Map

2.3.1 List

//optional or required
<list-repetition> group <name> (LIST) {
	//必须是repeated,我认为是为了识别到下一个list,当很多行的list都存在了一列,怎么识别出来哪个元素是哪个列的
  repeated group list {
  	//optional or required
    <element-repetition> <element-type> element;
  }
}

在这里插入图片描述

​ 如上图,只有根节点才会存储数据,通过r的级别就可以组装出list

2.3.2 Map

//optional or required
<map-repetition> group <name> (MAP) {
  repeated group key_value {
  	//只要map里有值,key就不能是null
    required <key-type> key;
    //optional or required
    <value-repetition> <value-type> value;
  }
}

在这里插入图片描述

三、parquet VS orc

3.1 嵌套数据

parquet在存储嵌套数据上更有优势,orc适用于存储扁平化的数据。我理解orc存储的struct或者map都是一条记录只出现一次的,如果想是上述案例中的一条记录可能有多个Code,这种orc不太适合。

3.2 2013年的对比(参考自Orc作者的演讲PPT)

在这里插入图片描述

上图中,Parquet里写 “N” 的地方,在新版本都有实现了!

​ 目前,Orc比Parquet多的一个特性是acid。

3.3 2016年的对比(分数据集对比)

3.3.1 NYC Taxi Data

**数据特点:**18列,22.7million行,类型有double,integer,dicimal,string,没有null

存储对比:

在这里插入图片描述

第一次存储对比结论:

  1. 不能用json!

  2. parquet要比orc优秀。

    orc作者不服,所以又按照列的类型进行了对比

按照存储类型对比:

在这里插入图片描述

按存储类型对比结论:

  1. 在double上parquet远优于orc,在timestamp上orc远优于parquet,因为parquet没有支持timestamp类型,而是用Logical type支持的。在其他字段的存储上都一样。

扫描全表对比:

在这里插入图片描述

扫描全表结论

  1. 有时候压缩也不一定会导致变慢

3.3.2 Github Logs

**数据特点:**704列,10.5 million 行,有大量的 structure 和 null

存储对比:

在这里插入图片描述

存储对比结论:

  1. zlib最优秀
  2. Avro最优秀,因为行string被压缩了

扫描全表对比:

在这里插入图片描述

扫描全表对比结论:

  1. Parquet表现的很差,有一部分原因是用在了垃圾回收上

在这里插入图片描述

3.3.3 对于只取少数列

在这里插入图片描述

3.4 spark sql的对比

数据集介绍:

case class PageImpression(
   userId: Long,
   date: Timestamp,
   refererUrl: String
)
21.2 G  avro
15.1 G  orc
30.2 G  parquet

在这里插入图片描述

注意date是timestamp类型的

case class Order(
	userId: Long,
	orderNo: String,
	date: Timestamp,
	productId: Int,
	productCode: String,
	productTitle: String,
	productPrice: Float,
	boughtPrice: Float,
	discountPercentageApplied: Byte
)
124.2 G  avro
93.4 G   orc
103.3 G  parquet

在这里插入图片描述

3.4 结论

  1. 存储格式的对比还是要真正的在实践中检测,在使用的时候,不仅要考虑到它本身设计的优越性,还要考虑到垃圾回收、真实数据在存储格式上的性能这些意想不到的事情。
  2. hive适合orc,spark适合parquet,这个结论现在看来不一定所有情况都适用,还需要具体实验。从网上看到说这个原因是因为spark在parquet上只吃了Vectorization机制,hive在orc上支持了Vectorization机制,要讲一下这个。
  3. 在2016年,orc要优于parquet,orc作者建议除了在少数情况下用Avro结合snappy,其余情况用orc结合zlib就行了!
  4. 以上的结论都是orc作者在2016年发表演讲中提到的,现在是什么情况还不能确定,因为每个格式都在发展!

参考文献

Performance of Avro, Parquet, ORC with Spark Sql:https://www.linkedin.com/pulse/performance-avro-parquet-orc-spark-sql-konstantine-kougios

dremel-made-simple-with-parquet:https://blog.twitter.com/engineering/en_us/a/2013/dremel-made-simple-with-parquet

Difference Between ORC and Parquet:http://www.differencebetween.net/technology/difference-between-orc-and-parquet/

why parquet is best for spark, and hive best for hive:https://stackoverflow.com/questions/32373460/parquet-vs-orc-vs-orc-with-snappy

File Format Benchmark - Avro, JSON, ORC & Parquet:https://www.slideshare.net/HadoopSummit/file-format-benchmark-avro-json-orc-parquet

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

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

相关文章

Linux命令scp用法

本文主要讲的是scp用法如果哪里不对欢迎指出&#xff0c;主页https://blog.csdn.net/qq_57785602?typeblog首先讲述一下scp用法并不是让你连接公司服务器后用的&#xff08;不是连接公司服务器使用&#xff09;&#xff0c;如果要使用的情况下那么请看下面&#xff1a;winr打开…

【C语言篇】请把这篇文章推给现在还对指针一知半解的童鞋~超生动图解,详细讲解,易懂,易学,让天下没有难懂的指针~

&#x1f331;博主简介&#xff1a;是瑶瑶子啦&#xff0c;一名大一计科生&#xff0c;目前在努力学习C进阶,JavaSE。热爱写博客~正在努力成为一个厉害的开发程序媛&#xff01; &#x1f4dc;所属专栏&#xff1a;C/C ✈往期博文回顾:进入内存,透彻理解数据类型存在的意义,整形…

[java拓展]Mysql数据库的基础指令,和JDBC的使用

1.关于mysql数据库 &#xff08;1&#xff09;概述 DBMS数据库管理系统&#xff0c;用来管理数据库&#xff0c;执行sql语句的东西&#xff0c;Mysql&#xff0c;oracle&#xff0c;sqlite这些严格来说不是数据库而是数据库管理系统&#xff0c;其中Mysql最常用&#xff0c;而…

马来酰亚胺聚乙二醇硅烷,MAL-PEG-Silane 结构,科研试剂溶于大部分有机溶剂

马来酰亚胺聚乙二醇硅烷&#xff0c;MAL-PEG-Silane 中文名称&#xff1a;马来酰亚胺聚乙二醇硅烷 分子量&#xff1a;1k&#xff0c;2k&#xff0c;3.4k&#xff0c;5k&#xff0c;10k&#xff0c;20k。。。 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 用…

剑指offer----C语言版----第十九天----面试题25:合并两个有序的链表

目录 1. 合并两个排序的链表 1.1 题目描述 1.2 解题思路 1.3 往期回顾 1. 合并两个排序的链表 原题链接&#xff1a;21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09;1.1 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个…

new-Crack:StarUML 5.1.0 -2023

StarUML 用于敏捷和简洁建模的复杂软件建模器 当前版本&#xff1a;v5.1.0 主要特征 通用语言2 兼容 UML 2.x 标准元模型和图表&#xff1a;类、对象、用例、组件、部署、复合结构、序列、通信、状态图、活动、时间、交互溢出、信息流和剖面图。 SYSML 支持 支持使用 SysML 图…

SSM03_SpringMVC REST风格 SSM整合

01-SpringMVC简介SpringMVC是隶属于Spring框架的一部分&#xff0c;主要是用来进行Web开发&#xff0c;是对Servlet进行了封装。SpringMVC是处于Web层的框架&#xff0c;所以其主要的作用就是用来接收前端发过来的请求和数据然后经过处理并将处理的结果响应给前端&#xff0c;所…

【iHooya】1月14日寒假集训课作业解析

内部元素之和 输入一个整数矩阵&#xff0c;计算位于矩阵内部的元素之和。所谓矩阵内部的元素&#xff0c;不在第一行和最后一行的元素以及第一列和最后一列的元素。 输入 第一行分别为矩阵的行数m和列数n&#xff08;m < 100&#xff0c;n < 100&#xff09;&#xff0…

Arthas 入门到实战(一)快速入门

Arthas官方文档指出&#xff1a; 介绍&#xff1a;Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&…

人工智能与游戏

游戏是智能应用最好的平台&#xff0c;可惜的是&#xff1a;只用了少部分计算AI&#xff0c;还没有用到智能的计算计1 引言从1950年香农教授提出为计算机象棋博弈编写程序开始&#xff0c;游戏人工智能就是人工智能技术研究的前沿&#xff0c;被誉为人工智能界的“果蝇”&#…

微信小程序070校园食堂订餐多商家带配送

基于微信小程序食堂订餐管理系 系统分为用户和管理员&#xff0c;商家三个角色 用户小程序端的主要功能有&#xff1a; 1.用户注册和登陆小程序 2.查看系统新闻资讯公告 3.用户查看小程序端的菜品信息&#xff0c;在线搜索菜品&#xff0c; 4.用户查看菜品详情&#xff0c;收…

数据结构-二叉搜索树解析和实现

1.含义规则特性二叉搜索树也叫排序二叉树、有序二叉树&#xff0c;为什么这么叫呢&#xff1f;名字由来是什么&#xff1f;主要是它的规则图一规则一&#xff0c;左子树的所有节点的值均小于它的根节点的值规则二&#xff0c;右子树的所有节点的值均大于它的根节点的值&#xf…

摇头测距小车01_舵机和超声波代码封装

目录 一、摇头测距小车图片演示 二、接线方式 三、代码实现 一、摇头测距小车图片演示 就是在小车原有的基础上&#xff0c;在小车前面加一个舵机和一个超声波&#xff0c;把超声波粘在舵机上 二、接线方式 1、超声波接线 VCC-----上官一号5V GND----上官一号GND Trig----…

.net开发安卓入门-Dialog

.net开发安卓入门-DialogAndroid.App.AlertDialog运行效果代码UI源码引入 下面这个类库才可以使用Java.Interop.Export特性绑定事件Android.App.AlertDialog https://learn.microsoft.com/zh-cn/dotnet/api/android.app.alertdialog?viewxamarin-android-sdk-13 SetTitle &…

nodejs+vue摄影跟拍预定管理系统

&#xff0c;本系统分为用户&#xff0c;摄影师&#xff0c;管理员三个角色&#xff0c;用户可以注册登陆系统&#xff0c;查看摄影套餐&#xff0c;预约套餐&#xff0c;购买摄影周边商品&#xff0c;查看跟拍照片等。摄影师可以对用户的摄影预约审核&#xff0c;跟拍流程管理…

【Java集合】ArrayList自动扩容机制分析

目录 先从 ArrayList 的构造函数说起 一步一步分析 ArrayList 扩容机制 先来看 add 方法 再来看看 ensureCapacityInternal() 方法 ensureExplicitCapacity()和calculateCapacity方法 下面我们接着来看grow() 方法 再来看一下grow()中调用的hugeCapacity() 方法 System.arrayco…

3、代码注释与编码规范

目录 一、代码注释 &#xff08;1&#xff09;单行注释 &#xff08;2&#xff09;多行注释 &#xff08;3&#xff09;文档注释 2. 编码规范 一、代码注释 &#xff08;1&#xff09;单行注释 “//”为单行注释标记&#xff0c;从符号“//”开始直到换行为止的所有内容…

3D立体字生成器【免费在线工具】

Text2STL是一个可以在线使用的免费的3D立体字生成工具&#xff0c;输入文字内容即可实时预览生成的3D立体字模型&#xff0c;还可以导出为STL模型用于3D打印&#xff1a; 3D立体字生成器访问地址&#xff1a; http://text2stl.bimant.com/zh-cn/generator 1、3D立体字生成风…

【零基础】学python数据结构与算法笔记11

文章目录前言65.树的概念66.树的实例&#xff1a;模拟文件系统67.二叉树的概念68.二叉树的遍历69.二叉搜索树的概念。70.二叉搜索树&#xff1a;插入71.二叉搜索树&#xff1a;查询72.二叉搜索树&#xff1a;删除73.二叉搜索树&#xff1a;删除实现总结前言 学习python数据结构…

中本聪是个贪婪的矿工吗?

对可能是中本聪的实体所表现出的挖矿行为的技术分析。文 | Jameson Lopp. 原标题&#xff1a;Was Satoshi a Greedy Miner?. 2022/9/16.* * *如果你在加密生态系统中待了足够久的时间&#xff0c;那么你无疑会听到这样的论点&#xff0c;即某些项目的代币分配不公平&#xff0…