Big Data file formats

Apache Spark 支持许多不同的数据格式,例如无处不在的 CSV 格式和 Web 友好的 JSON 格式。主要用于大数据分析的常见格式是 Apache Parquet 和 Apache Avro。

在这篇文章中,我们将介绍这四种格式的属性 – CSV、JSON、Parquet 和 Avro与 Apache Spark。

您可能还喜欢:
阿帕奇火花。

Csv

CSV(逗号分隔值)文件通常用于使用纯文本在系统之间交换表格数据。CSV 是基于行的文件格式,这意味着文件的每一行都是表中的行。基本上,CSV 包含一个为数据提供列名称的标头行,否则,文件被视为部分结构化。

CSV 文件最初无法显示分层数据或关系数据。数据连接通常使用多个 CSV 文件进行组织。外键存储在一个或多个文件的列中,但这些文件之间的链接不由格式本身表示。此外,CSV 格式尚未完全标准化,因此文件可以使用逗号以外的分隔符,如制表符或空格。

CSV 文件的其他属性之一是,它们仅在原始未压缩文件或使用可拆分压缩格式(如bzip2lzo)时才可拆分(注意:lzo 需要编制索引才能拆分!

优势

  • CSV 是人读的,易于手动编辑。
  • CSV 提供了一个简单的信息架构。
  • CSV 由几乎所有现有应用程序处理。
  • CSV 易于实现和解析。
  • CSV 结构紧凑。对于 XML,您将为每一行中的每一列启动标记和结束标记。在 CSV 中,您只编写一次列头。

缺点

  • CSV 允许使用平面数据。除了格式之外,还需要处理复杂的数据结构。
  • 不支持列类型。文本列和数字列之间没有区别。
  • 没有表示二进制数据的标准方法。
  • 导入 CSV 的问题(无空和引号之间没有区别)。
  • 特殊字符支持不足。
  • 缺乏通用标准。

尽管CSV文件有其局限性,但它们是数据共享的热门选择,因为它们受到各种业务应用程序、消费者和科学应用的支持。同样,大多数批处理和流式数据处理模块(例如 Spark 和 Hadoop)最初支持 CSV 文件的序列化和反序列化,并提供在读取时添加架构的方法。

Json

JSON 数据(JavaScript 对象表示法)以部分结构化格式表示为键值对。JSON 经常被比作 XML,因为它可以以分层格式存储数据。子数据由父数据显示。这两种格式都是用户自我描述和可读的,但 JSON 文档通常要小得多。因此,它们更常用于网络通信,特别是随着基于 REST 的 Web 服务的出现。

由于许多数据传输已经使用 JSON 格式,大多数 Web 语言最初支持 JSON 或使用外部库序列化和反序列化 JSON 数据。得益于这种支持,JSON 通过呈现数据结构、热数据的交换格式和冷数据存储,在逻辑格式中使用尽管 JSON 文档中包含的数据最终可以以性能优化的格式(如 Parquet 或 Avro)存储,但它们提供原始数据,这对重新处理数据非常重要(如有必要)。

JSON文件有几个优点:

  • JSON 支持分层结构,简化了在一个文档中存储相关数据以及复杂关系的表示。
  • 大多数语言提供简化的 JSON 序列化库或 JSON 序列化/反序列化的内置支持。
  • JSON 支持对象列表,有助于避免列表不稳定地转换为关系数据模型。
  • JSON 是 NoSQL 数据库(如 MongoDB、Couchbase 和 Azure Cosmos DB)广泛使用的文件格式。
  • 大多数工具的内置支持。

实木 复合 地板

Parquet 于 2013 年推出,由 Cloudera 和 Twitter 开发,用作基于列的存储格式,针对多列数据集进行了优化。由于数据由列存储,因此可以进行高度压缩(压缩算法对信息熵较低的数据执行得更好,通常包含在列中)和可拆分的数据。格式的开发人员声称,这种存储格式是大数据问题的理想选择。

与 CSV 和 JSON 不同,Parquet 文件是包含有关其内容的元数据二进制文件。因此,在不读取/分析文件内容的情况下,Spark 可以仅依靠元数据来确定列名称、压缩/编码、数据类型,甚至一些基本统计信息。Parquet 文件的列元数据存储在文件的末尾,允许快速、单次写入。

Parquet针对”一次读取多读(WORM)”范例进行了优化。写得很慢,但阅读速度却非常快,尤其是当您只访问总列的子集时。Parquet是读取繁重的工作负载的最佳选择。对于要求对整行数据进行操作的用例,应使用 CSV 或 AVRO 等格式。

Parquet 中数据存储的优势:

  • 帕奎特是一种列格式。只提取/读取所需的列,这减少了磁盘 I/O。此概念称为投影向下。
  • 架构随数据一起传输,因此数据是自我描述的。
  • 尽管数据是为 HDFS 创建的,但数据可以存储在其他文件系统中,例如 GlusterFs 或 NFS 之上。
  • Parquet 只是文件,这意味着很容易使用它们、移动、备份和复制。
  • Spark 开箱即用的本机支持提供了将文件保存到存储中的能力。
  • Parquet 提供非常好的压缩高达 75% 时,即使使用压缩格式,如快。
  • 实践表明,与其他文件格式相比,此格式是读取工作流最快的格式。
  • Parquet 非常适合数据仓库类型的解决方案,其中某些列需要聚合到一组庞大的数据上。
  • 可以使用 Avro API 和 Avro Schema 读取和写入 Parquet(这提供了以 Avro 格式存储所有原始数据的想法,但所有已处理的数据都存储在 Parquet 中)。
  • 它还提供谓词向下推送,从而进一步降低磁盘 I/O 成本。

谓词向下/筛选器向下推

谓词向下推送的基本思想是,查询的某些部分(谓词)可以”推送”到数据存储的位置。例如,当我们给出一些筛选条件时,数据存储会尝试在从磁盘读取时筛选记录因此,性能更好。否则,整个数据将放入内存,然后进行筛选,从而导致较大的内存需求。

这种优化可以通过更早而不是更晚地筛选出数据来大大减少查询/处理时间。根据处理框架,谓词向下可以通过执行以下操作来优化查询:通过网络传输数据之前筛选数据、在加载到内存之前筛选数据或跳过读取整个文件或文件块。

这一概念被大多数 RDBMS 所遵循,并遵循了大型数据存储格式,如 Parquet 和 ORC。

投影向下推

Predicate Pushdown/Filter Pushdown

谓词向下/筛选器向下推

从数据存储读取数据时,将只读取所需的列,如查询;如果数据来自数据存储区,则读取这些列。并非所有的字段都会被读取。通常,像Parquets和ORC这样的柱形格式遵循这个概念,从而产生更好的I/O性能。

阿夫罗

Apache Avro 于 2009 年由 Hadoop 工作组发布。它是高度可拆分的基于行的格式。它还被描述为类似于Java序列化的数据序列化系统。架构以 JSON 格式存储,而数据存储为二进制格式,从而最大限度地减少文件大小并最大限度地提高效率。

Avro 通过管理添加的字段、缺少的字段和已更改的字段,对架构演进提供了强大的支持。这允许旧软件读取新数据和新软件来读取旧数据 – 如果数据有可能更改,则这是一个关键功能。

凭借 Avro 管理架构演进的能力,可以在不同时间独立更新组件,并且具有较低的不兼容风险。这样,应用程序就不必编写 if-else 语句来处理不同的架构版本,并且使开发人员不必查看旧代码来理解旧架构。

由于架构的所有版本都存储在人可读的 JSON 标头中,因此很容易理解所有可用字段。

Avro 可以支持许多不同的编程语言。由于架构在数据二进制时存储在 JSON 中,因此 Avro 是持久数据存储和电汇的相对紧凑的选项。Avro 通常是编写繁重的工作负载的首选格式,因为 Aavro 易于追加新行。

优势

  • Avro 是语言中立的数据序列化。
  • Avro 将架构存储在文件的标头中,以便数据是自描述的。
  • Avro 格式化文件是可拆分和可压缩的,因此它是 Hadoop 生态系统中数据存储的一个很好的候选项。
  • 用于读取 Avro 文件的架构不必与用于写入文件的架构相同。这样就可以独立添加新字段。
  • 与序列文件一样,Avro 文件还包含用于分隔块的同步标记。这使得它高度可分割。
  • 这些块可以使用压缩格式(如快速)进行压缩。

总结

Format comparison

格式比较

*JSON 在压缩时与 CSV 具有相同的可拆分性问题,有一个额外的区别。当”完整文件”选项设置为 true 时(re:感谢您的阅读!

有问题吗?在下面留下您的评论,开始精彩的讨论!

看看我的博客或来说嗨在Twitter或订阅我的电报频道。
计划你最好的!

进一步阅读

Comments are closed.