当前位置: 首页 > 科技观察

四种大数据文件格式解析

时间:2023-03-20 23:01:24 科技观察

【.com速译】ApacheSpark支持多种不同的数据格式,包括:无处不在的CSV格式、Web友好的JSON格式,以及大数据分析常用的ApacheParquet和ApacheAvro.在本文中,我们将通过ApacheSpark向大家介绍以上四种大数据文件格式的各种属性,并比较它们的优缺点。1、CSVCSV(Comma-SeparatedValues,逗号分隔值)文件通常用于在使用纯文本的系统之间交换表格类型的数据。CSV是一种基于行的文件格式。也就是说,此类文件中的每一行都对应于数据表中的特定行。通常,CSV文件包含提供数据列名称的标题行。如果没有标题行,则文件将被视为部分结构化。单个CSV文件通常无法显示层次结构或数据关系。但是,特定的数据连接关系往往需要组织多个CSV文件。各种外键(Foreignkeys)一般存储在一个或多个文件中的多个列中。但是,这些文件之间的链接并不由格式本身表示。此外,由于尚未完全标准化,因此在CSV格式文件中可以使用逗号以外的分隔符,例如制表符或空格。CSV文件的另一个特点是仅在未压缩的原始文件状态下,或使用bzip2(https://en.wikipedia.org/wiki/Bzip2)或lzo(https://ru.wikipedia.org/wiki)等方法/LZO)等解压工具,可以对CSV文件进行拆分(注意:lzo需要先建立索引才能进行拆分)。优点:CSV易于人类阅读和手动编辑。CSV提供了一个简单明了的信息模式(schema)。几乎所有现有的应用程序都能够处理CSV文件。CSV文件相对容易实现和解析。使用XML,您需要为每一行的每一列添加开始和结束标记;而CSV更简约,您只需一次性编写列标题。缺点:由于处理的是平面数据,复杂的数据结构需要提前进行格式转换。由于不支持列的类型,因此文本列和数字列之间没有区别。没有表示二进制数据的标准方法。由于NULL和引号之间没有区别,因此在导入CSV时可能会出现问题。对特殊字符的支持很差。缺乏共同的标准。尽管存在局限性,但CSV文件仍然是数据共享的绝佳选择。它通常用于各种商业应用程序、消费行业和科学分析程序。目前大多数批流式数据处理模块(如Spark、Hadoop)都可以支持CSV文件的序列化和反序列化。它们提供了在读取模式时添加模式的方法。2.JSON格式JSON数据(JavaScriptobjectnotation,对象表示法)是一种部分结构化的格式,表示各种键值(key-value)对。与XML不同的是,JSON通常可以分层格式存储数据,即子数据可以被父数据显示。并且和XML一样,它们在格式上是自描述的(self-describing),用户可以直接阅读。但是,JSON文档通常要小得多。随着基于REST的Web服务的激增,JSON文档在网络通信中频繁使用。由于JSON格式已经被用于多种类型的数据传输,所以目前大部分的网络编程语言都可以支持JSON,或者使用外部库对JSON数据进行序列化和反序列化。正是在这种支持下,JSON可以通过展示数据结构,帮助用户实现热数据与冷数据存储涉及的各种逻辑格式的格式转换。目前很多批流数据处理模块都可以原生支持JSON序列化和反序列化。不仅可以将JSON文档中包含的数据存储为性能更优化的格式(如Parquet或Avro),而且JSON提供的原始数据类型对于按需数据再处理任务也非常重要。JSON文件具有以下优点:JSON支持层次结构,简化了文档中相关数据的存储和复杂关系的表示。大多数编程语言都提供简化的JSON序列化库,并提供对JSON序列化/反序列化的内置支持。JSON支持对象列表,这有助于避免将对象列表错误地转换为关系数据模型。MongoDB、Couchbase和AzureCosmosDB等NoSQL数据库支持JSON文件格式。今天的大多数工具都内置了对JSON的支持。3.ParquetCloudera和Twitter在2013年开发了Parquet,它可以作为一种基于列的存储格式,并针对多列数据集进行了适当的优化。由于它的数据是按列存储的,它可以对数据进行高度压缩(它的压缩算法对信息熵较低的列中包含的数据更有效),以及拆分操作。Parquet的开发者声称这种存储格式非常适合处理大数据相关的问题。与CSV和JSON不同,Parquet是一个二进制文件,包含各种特定于其内容的元数据。因此,在不读取和解析文件内容的情况下,Spark只能依靠元数据来确定文件中的列名、压缩/编码方式、数据类型,甚至一些基本的统计信息。另外,由于Parquet文件的列相关元数据通常存放在文件末尾,方便用户一次性快速写入信息。同时Parquet也针对WORM的范式进行了优化(WriteOnceReadMany,参见WriteOnceReadMany)。虽然写入文件时速度很慢,但用户读取时却出奇地快,尤其是在仅访问特定列的子集时。可以看出,对于需要大量读取操作的工作负载,Parquet是一个不错的选择。对于需要操作整行数据的用例,用户应使用CSV或AVRO等格式。Parquet在数据存储方面的优势包括:由于是柱状结构的形式,Parquet只读取需要的列信息,从而减少了磁盘I/O的消耗。这个概念称为投影下推。由于模式随数据移动,因此数据可以是自描述的。虽然主要是为HDFS创建的,但它的数据可以很好地存储在其他文件系统中,如GlusterFs或NFS。作为文件,您可以轻松地移动、备份、复制和使用Parquet。它可以为Spark提供开箱即用的原生支持,可以直接读取和保存用户存储中的文件。在使用snappy等压缩格式时,Parquet可以达到75%的高压缩率。实际上,与同类中的其他文件格式相比,这种格式读取工作流的速度最快。Parquet非常适合需要对大量数据进行列汇总的数据仓库应用。Parquet可以通过AvroAPI和AvroSchema进行读写。Parquet可以通过提供谓词下推来进一步降低磁盘I/O的成本。PredicatePushdown/FilterPushdown谓词下推的基本思想是将查询的某些部分(如:谓词)“推”到数据的存储位置。例如,当我们提供一些过滤条件时,数据存储会以过滤记录的方式从磁盘中读取数据。predicatepushdown的优点:它不需要大量的内存,也不会产生过多的磁盘I/O,因为不需要将整个数据读入内存并进行过滤。显然,整体性能得到了显着提升。可以看出,此类方法通过更早地过滤掉不相关的数据,可以大大减少查询和处理时间。根据处理框架的不同,谓词下推可以通过执行不同的操作来优化查询。例如:在网络传输数据之前过滤数据,在将数据加载到内存之前过滤数据,或者跳过读取整个文件(文件块)等。目前,大多数RDBMS,包括Parquet和ORC等大数据存储格式都能够遵循谓词下推的相关概念。投影下推投影下推的基本思想是:在从存储中查询和读取数据时,不是读取所有字段,而是只读取那些必要的列。通常,像Parquets和ORC这样的列式格式遵循这个概念可以产生更好的I/O性能。4.AvroApacheAvro,由Hadoop工作组于2009年发布,是一种基于行的、高度可拆分的数据格式。Avro可以支持多种编程语言。通常,它也被描述为类似于Java序列化的数据序列化系统。为了最小化文件大小和提高效率,它以JSON格式存储模式,以二进制格式存储数据。Avro通过管理各种添加、缺失和更改的字段,为模式演化提供强大的支持。这允许旧软件读取新数据,新软件读取那些旧数据。这对于经常变化的数据来说非常重要。通过模式架构的管理能力,Avro可以在不同的时间独立更新不同的组件,从而降低不兼容的风险。同时,开发人员不必在应用程序中编写if-else语句来应对不同的架构版本,也不必查看旧代码来了解那些旧架构。此外,所有版本化模式都存储在人类可读的JSON标头中,使开发人员可以轻松理解所有可用字段。如前所述,由于模式以JSON格式存储,数据以二进制形式存储,因此Avro是持久数据存储和有线传输的极简选择。此外,由于用户可以轻松地将新数据行附加到Avro,因此它通常是那些写入繁重的工作负载的首选格式。优点:Avro是一种语言中立的数据序列化。Avro将模式存储在文件的标头中,因此数据是自描述的。Avro格式的文件可以拆分压缩,非常适合Hadoop生态中的数据存储。由于Avro文件将负责读取的模式与负责写入的模式分开,因此它可以独立添加新字段。和序列文件(SequenceFiles)一样,为了实现高度的可拆分性,Avro文件也包含同步标记,用于分隔不同的块(block)。可以使用诸如snappy之类的压缩格式来压缩不同的目标块。总结下表是对上述四种文件格式的综合比较。上表中的星号是:JSON在压缩为CSV时具有类似的可拆分性问题。即:当“wholeFile”选项设置为true时,JSON不可拆分(参见SPARK-18352)。CSV写入速度最快;JSON易于人类阅读和理解;Parquet读取列子集的速度最快;而Avro在一次读取所有列方面是最快的。JSON是网络通信的标准。通过定义良好的架构,各种API和网站可以使用JSON进行持续通信。针对大数据的需求,Parquet和Avro针对拆分进行了优化,可以支持各种压缩和复杂的数据结构。但是,它们的可读性和写入速度很差。原标题:大数据文件格式详解,作者:luminousmen