spark处理数据库大数据(大数据系列Spark常用数据格式介绍CSV)
Spark 常用文件格式
介绍:Apache Spark支持许多不同的数据格式,例如无处不在的CSV格式和Web友好的JSON格式。主要用于大数据分析目的的常见格式是Apache Parquet和Apache Avro。
在本文中,我们将使用Apache Spark来介绍这四种格式的特性-CSV,JSON,Parquet和Avro。
CSVCSV(逗号分隔值)文件通常用于在使用纯文本的系统之间交换表格数据。CSV是基于行的文件格式,这意味着文件的每一行都是表中的行。基本上,CSV包含一个标题行,该标题行提供了数据的列名,否则,文件被认为是部分结构化的。
CSV文件最初不能显示层次结构或关系数据。数据连接通常使用多个CSV文件进行组织。外键存储在一个或多个文件的列中,但是这些文件之间的链接不是由格式本身来表示的。另外,CSV格式尚未完全标准化,因此文件可以使用逗号以外的定界符,例如制表符或空格。
CSV文件的其他属性之一是,仅当它是未压缩的原始文件或使用可拆分压缩格式(例如bzip2或lzo)时,它们才可以拆分(注意:lzo需要索引才能可拆分!)。
好处:
·CSV是人类可读的,并且易于手动编辑。
·CSV提供了简单明了的信息模式。
·几乎所有现有应用程序都能处理CSV。
·CSV易于实现和解析。
·CSV紧凑。对于XML,您可以为每行中的每一列添加开始标签和结束标签。在CSV中,您只需写入一次列标题。
缺点:
·CSV允许使用平面数据。除了格式外,还需要处理复杂的数据结构。
·不支持列类型。文本列和数字列之间没有区别。
·没有表示二进制数据的标准方法。
·导入CSV的问题(NULL和引号之间没有区别)。
·特殊字符支持差。
·缺乏通用标准。
尽管存在局限性,但CSV文件还是数据共享的流行选择,因为它们得到了广泛的业务应用程序,消费者和科学应用程序的支持。同样,大多数批处理和流数据处理模块(例如Spark和Hadoop)最初都支持CSV文件的序列化和反序列化,并提供了在读取时添加架构的方法。
JSON格式JSON数据(JavaScript对象表示法)以部分结构化格式表示为键值对。JSON通常与XML进行比较,因为它可以按分层格式存储数据。子数据由父数据显示。两种格式都是自描述的,并且可由用户读取,但是JSON文档通常要小得多。因此,它们更常用于网络通信中,尤其是随着基于REST的Web服务的出现。
由于许多数据传输已经使用JSON格式,因此大多数Web语言最初都支持JSON或使用外部库对JSON数据进行序列化和反序列化。由于有了这种支持,JSON通过显示数据结构,热数据的交换格式和冷数据存储以逻辑格式使用。
许多批处理和流数据处理模块本机支持JSON序列化和反序列化。尽管JSON文档中包含的数据最终可以以性能更优化的格式(例如Parquet或Avro)存储,但它们提供原始数据,这对于重新处理数据非常重要(如有必要)。
JSON文件具有以下优点:
·JSON支持分层结构,简化了一个文档中相关数据的存储和复杂关系的表示。
·大多数语言都提供简化的JSON序列化库或对JSON序列化/反序列化的内置支持。
·JSON支持对象列表,有助于避免列表到关系数据模型的错误转换。
·JSON是NoSQL数据库(例如MongoDB,Couchbase和Azure Cosmos DB)广泛使用的文件格式。
·当今大多数工具中的内置支持。
ParquetParquet于2013年推出,由Cloudera和Twitter开发,用作基于列的存储格式,已针对多列数据集进行了优化。由于数据是按列存储的,因此可以进行高度压缩(压缩算法对信息熵较低的数据(通常包含在列中)的性能更好),并且可以拆分。该格式的开发者声称,这种存储格式非常适合大数据问题。
与CSV和JSON不同,Parquet文件是二进制文件,其中包含有关其内容的元数据。因此,无需读取/解析文件的内容,Spark可以仅依靠元数据来确定列名称,压缩/编码,数据类型,甚至一些基本统计信息。Parquet文件的列元数据存储在文件的末尾,从而可以进行快速的一次性写入。
Parquet针对“一次写入多次读取”(WORM)范例进行了优化。写起来很慢,但是读起来却快得令人难以置信,尤其是当您仅访问总列的一个子集时。对于需要大量读取的工作负载,镶木地板是一个不错的选择。对于需要对整行数据进行操作的用例,应使用CSV或AVRO之类的格式。
Parquet中数据存储的优点:
·Parquet是一种柱状格式。仅需要的列将被获取/读取,这减少了磁盘I / O。这个概念称为投影下推。
·模式随数据一起移动,因此数据是自描述的。
·尽管事实是它是为HDFS创建的,但数据仍可以存储在其他文件系统中,例如GlusterFs或NFS之上。
·Parquet只是文件,这意味着可以轻松使用它们,移动,备份和复制它们。
·开箱即用的Spark内部支持提供了将文件简单地保存并保存到存储中的功能。
·即使使用像Snappy这样的压缩格式,Parquet也可以提供高达75%的极佳压缩率。
·如实践所示,与其他文件格式相比,此格式是读取工作流最快的格式。
·Parquet非常适用于需要对大量数据的某些列进行聚合的数据仓库类型的解决方案。
·可以使用Avro API和Avro Schema(可以将所有原始数据存储为Avro格式,但将所有处理后的数据存储在Parquet中)来读取和写入Parquet。
·它还提供谓词下推,从而进一步降低了磁盘I / O成本。
谓词下推/过滤下推(Predicate Pushdown/Filter Pushdown)
谓词下推的基本思想是可以将查询的某些部分(谓词)“推送”到存储数据的位置。例如,当我们提供一些过滤条件时,数据存储将在从磁盘读取数据时尝试过滤记录。
谓词下推的优点是更少的磁盘I / O发生。结果,性能更好。否则,整个数据将被带入内存,然后进行过滤,这将导致大量的内存需求。
此优化可以通过较早而不是稍后过滤掉数据来大大减少查询/处理时间。根据处理框架的不同,谓词下推可以通过执行以下操作来优化查询,例如在通过网络传输之前过滤数据,在加载到内存之前过滤数据或跳过读取整个文件或文件块的操作。
大多数RDBMS都遵循此概念,Parquet和ORC等大数据存储格式也遵循此概念。
投影下推(Projection Pushdown)从数据存储中读取数据时,根据查询,仅将读取那些必需的列;并非所有字段都将被读取。通常,Parquets和ORC之类的列格式遵循此概念,从而产生更好的I / O性能。
AvroApache Avro由Hadoop工作组于2009年发布。它是一种基于行的格式,可高度拆分。它也被描述为类似于Java序列化的数据序列化系统。模式以JSON格式存储,而数据以二进制格式存储,从而最大程度地减小了文件大小并提高了效率。
Avro通过管理添加的字段,缺少的字段和已更改的字段,为模式演变提供了强大的支持。这使旧软件可以读取新数据,而新软件可以读取旧数据-如果您的数据有可能更改,则这是一项关键功能。
借助Avro的模式架构管理能力,可以在不同时间独立更新组件,从而降低不兼容风险。这使应用程序不必编写if-else语句来处理不同的架构版本,并且使开发人员不必查看旧代码来理解旧架构。
由于架构的所有版本都存储在人类可读的JSON标头中,因此很容易理解所有可用字段。
Avro可以支持许多不同的编程语言。因为架构是在数据以二进制形式存储时以JSON格式存储的,所以Avro是持久性数据存储和电汇的相对紧凑的选择。由于Avro易于附加新行,因此它通常是繁重的写工作负载的首选格式。
好处:
·Avro是与语言无关的数据序列化。
·Avro将模式存储在文件的标题中,以便数据可以自我描述。
·Avro格式的文件可拆分且可压缩,因此非常适合在Hadoop生态系统中进行数据存储。
·用于读取Avro文件的架构不必与用于写入文件的架构相同。这样就可以独立添加新字段。
·与序列文件一样,Avro文件也包含用于分隔块的同步标记。这使其高度可拆分。
·可以使用诸如snappy之类的压缩格式来压缩这些块。
总结
格式比较
*当压缩为CSV时,JSON具有可拆分性相同的问题,但有一个额外的区别。当“ wholeFile”选项设置为true时(例如:SPARK-18352),JSON不可拆分。
1. CSV通常应该是最快写入的。JSON应该是人类最容易理解的。Parquet应该是最快读取列的一个子集,而Avro应该是最快读取一次所有列的。
2. JSON是用于在网络上进行通信的标准。由于API和网站的可用性属性(如定义良好的架构),它们一直在使用JSON进行通信。
3. Parquet和Avro绝对针对大数据需求进行了优化,包括可拆分性,压缩支持,对复杂数据结构的强大支持。不幸的是,可读性和写入速度都非常差。
译自 :dzone
如果发现任何不正确的地方,或者想分享有关上述主题的更多信息,欢迎反馈。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com