解析四种大数据文件格式:排第一的竟然是它

在本文中,我们将通过Apache Spark,来向您介绍上述四种大数据文件格式的各种属性,及其优缺点比较。

1、CSV

CSV(Comma-Separated Values,逗号分隔值)文件,通常被用于在使用纯文本的系统之间,交换表格类型的数据。CSV是一种基于行的文件格式。也就是说,此类文件中的每一行都对应到数据表中的具体某一行。通常,CSV文件里包含有一个标题行,该标题行提供了数据的列名。如果没有标题行的话,该文件将被视为已部分完成了结构化工作。

单个CSV文件往往无法显示层次化的结构、或数据关系。而具体的数据连接关系往往需要通常多个CSV文件进行组织。各种外键(Foreign key)一般被存储在一个或多个文件的多个列中。不过这些文件之间的链接并非由其格式本身来表示。此外,由于并未完全标准化,因此在CSV格式文件中,您可以使用逗号以外的界定符,例如:制表符(tabs)或空格。

优点:

CSV易于人工阅读,也易于手动编辑。

CSV提供了一种简单明了的信息模式(schema)。

几乎所有现有的应用程序都能够处理CSV文件。

CSV文件比较易于实现和解析。

对于XML而言,您需要在每一行的每一列中分别添加开始与结束标签;而CSV比较简约,您只需一次性写入列标题即可。

缺点:

由于处置的是平面数据,因此需要事先对复杂的数据结构进行格式上的转换。

由于不支持列的类型,因此在文本列和数字列之间并无区别。

并无表示二进制数据的标准方法。

由于NULL和引号之间并无区别,因此导入CSV时可能会出现问题。

对于特殊字符的支持性较差。

缺乏通用的标准。

尽管存在着一定的局限性,但CSV文件仍然是数据共享领域的上乘之选。它经常被广泛地用于各类业务应用、消费者行业、以及科学分析程序中。当前,大多数批处理和流数据处理模块(如Spark和Hadoop),都能够支持CSV文件的序列化与反序列化。它们在读取时提供了添加schema的方法。

2、JSON格式

JSON数据(JavaScript object notation,对象表示法)是以部分结构化的格式,表示各种键值(key-value)对。与XML不同,JSON通常可以按照分层的格式存储数据,即:子数据可以由父数据来显示。而与XML相同的是,它们在格式上都具有自我描述性(self-describing),可以被用户直接读取。不过,JSON文档通常要小得多。随着基于REST的Web服务的大量出现,JSON文档被频繁地使用在网络通信中。

由于许多类型的数据传输都已经用到了JSON格式,因此目前大多数的Web编程语言都能够支持JSON,或者通过使用外部库,来对JSON数据进行序列化和反序列化。正是有了这种支持,JSON能够通过显示数据结构,帮助用户实现热数据(hot data)的格式转换、以及冷数据(cold data)存储所涉及到的各种逻辑格式。

目前,许多批处理与流数据处理模块,都能够原生地支持JSON的序列化和反序列化。JSON文档中包含的数据,不但最终能够以性能更为优化的格式(如Parquet或Avro)予以存储,而且JSON所提供的原始数据类型,对于按需进行数据重新处理的任务也是非常重要的。

JSON文件具有如下优点:

JSON支持分层式结构,简化了文档中有关数据的存储,以及复杂关系的表示问题。

大多数编程语言都能够提供简化的JSON序列化库,并且能够对JSON序列化/反序列化提供内置的支持。

JSON支持对象列表,能够有助于避免将对象列表错误地转换为关系型数据模型。

诸如MongoDB、Couchbase和Azure Cosmos DB等NoSQL数据库,都能够支持JSON文件格式。

目前大多数工具都内置了对于JSON的支持。

3、Parquet

Cloudera和Twitter于2013年开发出了Parquet。它可以被用作基于列的存储格式,并针对多列数据集进行了适当地优化。由于其数据是按列进行存储的,因此它可以对数据进行高度压缩(其压缩算法对于那些包含在列中的、信息熵值较低的数据,效果会更好),以及拆分操作。Parquet的开发者号称:此类存储格式非常适合于处理大数据的相关问题。

Parquet在数据存储方面的优点包括:

由于是一种柱状结构的形式,因此Parquet只会读取所需的列信息,进而减少了对于磁盘I/O的消耗。这个概念被称为投影下推(projection pushdown)。

由于schema是随着数据一起移动的,因此数据能够自我描述(self-describing)。

虽然主要是为HDFS而创建的,但是其数据完全可以被存储在GlusterFs或NFS之类的其他文件系统中。

作为一个文件,您可以轻松地对Parquet进行移动、备份、复制、以及使用。

能够对Spark提供开箱即用式的原生支持,能够对于用户存储中的文件直接进行读取与保存。

在实际运用中,与同类其他文件格式相比,该格式读取工作流的速度最快。

Parquet非常适合于那些需要对大量数据进行列汇总的数据仓库类应用。

可以通过Avro API和Avro Schema来读取和写入Parquet。

通过提供谓词下推(predicate pushdown),Parquet可以进一步降低磁盘I/O的成本。

谓词下推/过滤下推

谓词下推的基本思想是:将查询的某些部分(如:谓词)“推送”到数据的存储位置。例如,当我们提供一些过滤条件时,数据存储将会以过滤记录的方式,再从磁盘中读取数据。

谓词下推的优点:由于不再需要将整个数据读入内存并进行过滤,因此它并不需要大量的内存,也不会产生过多的磁盘I/O。显然整体性能得到了显著提升。

可见,此类方法可以通过较早地过滤掉无关数据的方式,来大幅减少查询与处理的时间。根据处理框架的不同,谓词下推可以通过执行不同的操作来优化查询。例如:在通过网络传输之前便过滤数据,在将数据加载到内存之前过滤数据,或是跳过读取整个文件(文件块)等操作。

目前,大多数RDBMS,包括Parquet和ORC等大数据存储格式,都能够遵循谓词下推的相关概念。

投影下推

投影下推的基本思想是:在对存储进行数据查询与读取时,并非读取所有字段,而只是读取那些必需的列。通常,Parquets和ORC之类的列格式都能够通过遵循此概念,以产生更好的I/O性能。

4、Avro

由Hadoop工作组于2009年发布的Apache Avro,是一种基于行的、可高度拆分的数据格式。Avro能够支持多种编程语言。通常,它也被描述为类似于Java序列化的数据序列化系统。为了最大程度地减小文件大小、并提高效率,它将schema存储为JSON格式,而将数据存储为二进制格式。

Avro通过管理各种添加、丢失、以及已更改的字段,来为schema的演化提供强大的支持。这使得旧的软件可以读取新的数据,而新的软件也可以读取那些旧的数据。而这对于那些经常发生变更的数据而言,是非常重要的。

Avro通过schema架构的管理能力,可以在不同的时段独立地更新不同的组件,从而降低了不兼容性所带来的风险。同时,开发人员既不必在应用程序中编写if-else语句,来应对不同的架构版本,也不必通过查看旧的代码,来理解那些旧的架构。而且,所有版本的schema都存储在可读的JSON标头中,以方便开发人员理解所有可用的字段。

如前文所述,由于schema是以JSON格式存储的,而数据是以二进制形式存储的,因此Avro是持久性数据存储和电传(wire transfer)的简约之选。另外,由于用户能够轻松地向Avro附加新的数据行,因此它通常是那些大量写入工作负载的首选格式。

优点:

Avro是一种与语言无关的数据序列化。

Avro将schema存储在文件的标题中,因此数据具有自描述性。

Avro格式的文件既可以被拆分、又可以被压缩,因此非常适合于在Hadoop生态系统中进行数据的存储。

由于Avro文件将负责读取的schema与负责写入的schema区分开来,因此它可以独立地添加新的字段。

与序列文件(Sequence Files)相同,为了实现高度可拆分性,Avro文件也包含了用于分隔不同块(block)的同步标记。

可以使用诸如snappy之类的压缩格式,来压缩不同的目标块。

总结

下表是上述四种文件格式的综合比较。

CSV有着最快的写入速度;JSON方便了人工阅读和理解;Parquet在读取列的子集方面速度最快;而Avro在一次性读取所有列方面速度最快。

JSON是Web通信方面的标准。通过定义良好的schema,各种API和网站可以持续使用JSON进行通信。

针对大数据的需求,Parquet和Avro进行了可拆分性方面的优化,可支持各种压缩,以及复杂数据结构。不过,它们的可读性和写入速度非常差。

原文标题:Big Data File Formats Explained,作者:luminousmen

提交成功!请耐心等待,我们的工程师会在24小时内联系您!

即时通讯云使用者请在应用详情页面咨询客服云使用者请进入管理员模式咨询

THE END
0.什么是JSON文件什么是 JSON文件 JSON(JavaScriptObject Notation)是一种轻量级的数据交换格式,它独立于语言,易于人阅读和编写,同时也易于机器解析和生成。JSON基于JavaScript的对象字面量语法,但是它作为一种数据格式,并不仅限于JavaScript中使用,许多编程语言都支持JSON的解析和生成。jvzquC41dnuh0lxfp0tfv8r2a78::9:691gsvrhng1jfvjnnu1752?939:?
1.C/C++程序开发:cJSON的使用(创建与解析JSON数据)cJSON如何创建一个JSON对象? cJSON如何添加键值对到JSON对象? 如何使用cJSON解析JSON字符串? 一、cJSON介绍 cJSON 是一个超轻巧,携带方便,单文件,可以作为 ANSI-C 标准的 JSON 解析器,是一个用C语言编写的简单好用的JSON解析器;它只包含一个C文件和一个头文件,可以非常容易集成到自己工程项目中。 并且cJSONjvzquC41enuvf7ygpekov7hqo1jfxnqqrgx0c{ykenk03B85328
2.使用JSON配置文件下表说明了 launch.json 文件的重要和必需属性。 但是,请务必首先了解本 launch.json 文件中的startupObjectId和startupObjectType属性。 无论什么时候您在 Visual Studio Code 中启动扩展,都应查看本 launch.json 文件,以确定需要先使用哪个对象。 上图显示了将从第 22 页开始,该页面是客户列表页面。 如果您开发jvzquC41fqit0vnetqyph}3eqo5{j6hp1vxbkwnpi1spf~qgu1oov{t/fg|fnxuogpz.gw{ktqtngwy18/ptqw4
3.什么是json文件51CTO博客已为您找到关于什么是json文件的相关内容,包含IT学习相关文档代码介绍、相关教程视频课程,以及什么是json文件问答内容。更多什么是json文件相关解答可以来51CTO博客参与分享和学习,帮助广大IT技术人实现成长和进步。jvzquC41dnuh0>6evq4dqv4vqrod1|mgpoktjrouqp}fpsncp0nuou
4.JSON文件的详细介绍,小白零基础轻松了解JSON文件博客介绍了JSON文件在游戏开发等场景的应用,包括存储配置、传输数据等。阐述了其文件扩展名、使用场景、基本结构和数据类型,以游戏开发中C#数据转JSON为例进行解释,还说明了JSON文件易读、轻量、跨平台兼容、易解析和便于Web集成等优势。 该文章已生成可运行项目,预览并下载项目源码 jvzquC41dnuh0lxfp0tfv8vsa8955=<7;1gsvrhng1jfvjnnu1747>=8;:;
5.在Linux下搭建Swift开发调试环境腾讯云开发者社区在第一次点击左侧的run按钮时,vscode会提示创建launch.json文件,我们也可以自己手动在.vscode目录中创建该文件。 image-20210214172254927 launch.json 代码语言:javascript 代码运行次数:0 运行 AI代码解释 { "version": "0.2.0", "configurations": [ { "type": "lldb", "request": "launch", "name": "DebjvzquC41enuvf7ygpekov7hqo1jfxnqqrgx0c{ykenk049:;:59
6.微信小程序中子目录index.json文件是什么?问答index.json 文件:页面配置文件,页面中的配置项会覆盖 app.json 的 window 属性中相同的配置项,对于jvzquC41fg|fnxugt0gmk‚zp0eun1jxm16:54;>
7.ASP.NETCore中的launchsetting.json是什么NCOUNTASP.NET Core中的launchsetting.json是什么 launchSettings.json描述了如何启动应用程序-要执行的命令,是否应打开浏览器,应设置哪些环境变量,等等。然后,dotnet run或任何其他工具可以使用此信息 来运行或调试应用程序。 此json文件包含与每个调试配置文件关联的项目特定设置。.NET Core或ASP.NET Core应用程序可以使用jvzquC41yy}/ewgnqiy/exr1{kmfijt|jqthuqjpi1v03<=74;810qyon
8.你真的了解package.json吗?我们可以使用 npm init 命令在任意我们想创建前端项目的文件夹中创建一个 package.json 文件。当我们运行该命令时,它会询问我们一系列的问题,我们输入的所有答案都会显示在我们的 package.json 文件中。 图片 当我们填入我们想要的信息后,就会在项目的根目录下创建一个package.json文件。 jvzquC41yy}/7:hvq0ipo8ftvkimg8<:2;:40qyon
9.什么是Json利用这样的语法,可以处理任何 JSON 格式的数据,而不需要使用任何额外的 JavaScript 工具包或 API。 和XML的比较 可读性 JSON和XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负。 可扩展性 XML天生有很好的扩展性,JSON当然也有,没有什么是XML可以扩展而JSON却不能扩展的。不过JSON在jvzquC41yy}/l|tp0et0yrpk0jznn
10.了解components.json文件和格式主题必须具有components.json文件,该文件位于/ThemeName/components.json中,用于指定主题中使用的组件。 此文件必须包含有效 JSON,该文件必须至少包含空 JSON 数组[]。 components.json文件语法列出所有本地组件并且完全支持组件的分类。(远程组件在组件目录中注册。) jvzquC41fqit0xwcenk/exr1enuvf8mgnr5{jhHP1euovnsv/erpwm4EGEIF1PZKF/KDF?673C39CA5/69I9/JIG5/75;KK9C6GE8@3jvo
11.JSON但现代前端开发里,json的应用范围越来越多,各种配置文件、js的export里,全是json,写起来让人倍感痛苦,遍地是坑。 比如半角符号错输成全角,比如少了逗号或结尾多了逗号,比如没有语法提示和代码块,比如键值对的选中和复制很低效 HBuilderX提供了多项优化技巧,达到最好的json编辑体验。学会这些,效率翻倍! jvzq<84jz0jdnxzf0pku0ls1Vwzptrfn1Ngoi~fig1ptqw
12.配置文件config.json详解鸿蒙系列03鸿蒙开发者社区小程序启动之后首先就是解析app.json,其实鸿蒙也一样,应用启动之后,先解析config.json文件。 config.json分为三个部分:app 、deviceConfig 、module 也可以通过这个截图查看,我这里展示的三块是缩放后的内容,也是为了方便观察。 app是整个项目的配置,包含了厂商信息、版本号等。 jvzquC41quz/7:hvq0ipo8uquvy039647
13.C语言实现手写JSON解析的方法详解C语言CharList *str_to_json_array(char *array); CharHashMap *str_to_json_map(char *dict); char *map_to_json_str(CharHashMap *pMap); char *array_to_json_str(CharList *pCharlist); BOOL str_is_map(char *str); BOOL str_is_array(char *str); #endif //STUDY_JSON_H 实现文件 1 2 3 4jvzquC41yy}/lk:30pku1jwvkerf1;;4:;;/j}r