当我们讨论选择用于存储数据的文件格式,无论是存储在数据库中还是供数据科学家进一步使用时,很多人可能会首先想到CSV格式。当考虑将数据发送到像MongoDB这样的文档数据库时,JSON可能会浮现在脑海中。然而,世界上还有许多其他文件格式,例如Parquet、Avro和ORC。今天,我们将讨论每种文件格式的优点和缺点,以及它们适合哪些场景,以便我们能更加高效地存储数据。
文件格式的重要性体现在哪里?如果我们系统需要处理大规模数据集(大数据),无论是进行数据分析,还是建立机器学习模型,或是进行法律数据审计,存储成本和读写速度对于业务来说至关重要。
- 大型数据存储 = 高成本
- 长读写时间 = 系统变慢,计算成本高
- 高计算能力 = 增加成本
这三个因素使得数据库中的文件格式优化变得至关重要。这不仅提高了系统的效率,还降低了运营成本。
感谢:https://medium.com/@gadhvirushiraj/the-best-file-format-for-data-science-ed756f937be8 (作者:gadhvirushiraj)
CSV — 简单但限制多多逗号分隔值(CSV)因为它既容易使用又得到了广泛软件的支持,是最流行的文件格式。它主要用于表格数据的交换。每一列都用逗号(,)分隔,每一行则通过新行来分隔。
例如,示例 CSV 数据如下:
年份,品牌,型号,描述,价格
1997,福特,E350,空调,防抱死制动系统,天窗,3000.00
但是,CSV存在一些限制。
- 无法存储复杂的层级数据结构或键值对等数据类型。
- 处理特殊字符(如字符串中的逗号)时会遇到问题,同时还需要区分空值和空白值。
- CSV 是行导向格式,这使得查询速度比列导向格式(如 Parquet)要慢。
这里对比了CSV和Parquet文件格式在Amazon S3中的差异。
CSV(逗号分隔值)的优点:
- 易于理解
- 文件尺寸小
- 可以用文本编辑器轻松打开和编辑
- 受到广泛支持
- 适合处理小数据集
CSV(逗号分隔值)的限制如下:
- 不保存数据类型的信息
- 无法保存复杂的资料
- 不适合存储大量数据(如超过1,000,000行)
- 不处理空值或空白
- 不适合用于分区数据存储
JavaScript 对象 notation(JSON)存储数据为键值对,并且常被开发者用于数据交换,例如 API。JSON 既易于阅读也易于理解,并且支持层次化的数据结构。
下面是一个 JSON 数据的例子:
{ "name": "约翰", "age": 13, "favoriteColors": ["最喜欢的颜色:红", "蓝", "绿"] }
关于性能,JSON 文件被认为读取速度较慢。由于 JSON 的结构,大多数人不倾向于使用它来存储分片的数据,因为合并分片的数据比较费劲。另一个问题是,JSON 格式与 CSV 类似,都是行导向的,因此查询数据的时间比 Parquet 等文件格式长得多。
JSON的好处:
- 读起来容易且理解起来简单
- 能够处理复杂的数据结构
- 可以通过文本编辑器轻松打开和编辑
- 在很多地方都能得到支持
- 适合用来交换数据对象
JSON的局限性:
- 需要转换成适合RDBMS存储的表格格式
- 不能验证模式
- 文件大小比CSV和Parquet更大
Parquet 是 Apache Hadoop 生态系统中的一种列存储文件格式,针对小文件尺寸和快速操作进行了优化的高性能。由于其高效性以及内置元数据,可以存储模式和结构信息,因此 Parquet 在大数据社区中很受欢迎。
元数据在 Parquet 文件中存储了文件的结构模式,在使用分区数据存储的系统中这一点非常有益。在读取数据时,数据库系统不需要读取整个文件就能判断查询的数据是否包含在其中,它只需访问 Parquet 文件的元数据即可立即得知。这就是 Parquet 非常受欢迎的关键原因之一。此外,Parquet 文件通常只有 CSV 文件大小的大约四分之一。
出处: https://dzone.com/articles/how-to-be-a-hero-with-powerful-parquet-google-and
然而,由于 Parquet 文件无法用文本编辑器读取,与团队成员讨论数据或思考数据时可能会觉得有些抽象。此外,使用 Parquet 文件需要编写 Apache Spark 或 Apache Hadoop 的代码,使其成为一种需要专门知识来操作和管理文件中数据的格式。例如,如果我们查询 Parquet 格式的数据时没有在查询条件中包含分区,则系统将无法利用元数据的优势。最终,系统将不得不读取文件中的所有数据。
Parquet的好处:
- 文件体积小巧
- 适合分区数据
- 读取速度快
- 支持嵌套结构
- 支持多种数据类型存储
- 非常适合处理大规模数据集
Parquet的局限性:
- 不能用普通的文本编辑器打开
- 在 Apache Spark 和 Apache Hadoop 之外的支持较少
- 需要专门的知识和技能
Avro 在大数据领域很受欢迎,特别是在与 Apache Kafka 和 Hadoop 一起使用时。它将元数据以 JSON 格式存储,便于阅读。尽管它采用行存储格式,但它很好地处理模式变化,并且同时还能高效地进行序列化。
来源https://www.clairvoyant.ai/blog/big-data-file-formats
尽管 Avro 格式以行存储数据,但它具有很高的读写速度(Avro 的真正优势在于其高效的写入能力),这是因为数据被序列化了。Avro 另一个优点是它在处理模式变更方面优于 Parquet。
就性能而言,Parquet 针对列的数据查询要快得多,比 Avro 更胜一筹。此外,Avro 也无法像 Parquet 一样用文本编辑器读取,也无法。
Avro的好处是:
- 存储元数据在 JSON 格式中
- 支持模式变更
- 适合写入密集型任务,例如 Kafka
- 处理小数据集(少于 1,000 行)高效
Avro的限制如下:
- 不适合频繁读取的任务
- 需要专门的知识背景
- 在Apache Kafka和Hadoop之外,支持非常有限
优化的行列存储格式(ORC)与 Parquet 类似,也是列存储的,并采用了称为条带(Stripe)的结构。它适合写入密集型操作,并支持 Apache Hive 的 ACID 事务。
来源: https://cwiki.apache.org/confluence/display/hive/languagemanual+orc
在Apache HIVE中,ORC格式来说,适合涉及大量数据写入和频繁模式变更的场景,以及执行如更新、删除和合并数据等操作的ACID事务。
尽管ORC作为一种文件格式看起来前途光明,但在在线社区里一个常见的问题是,与Parquet相比,ORC的支持较少。这意味着遇到问题时可能更难找到帮助。
来源https://www.datanami.com/wp-content/uploads/2018/05/Nexla-File-Format.png
ORC的优点如下:
- 适用于写密集型任务
- 支持ACID事务
- 性能优越
ORC的限制(注:ORC为特定技术术语):
- 相比Parquet,社区支持较弱
- 需要专门的技能和知识
- 除了在Apache Hive和Hadoop之外,其他支持较为有限
除了这五种格式之外,许多其他文件格式也存在,每种格式都有其优势和适用场景。比如,CSV 和 JSON 适合用于小数据集(少于1,000,000行)或快速实施,而 Parquet、Avro 或 ORC 则更适合大规模具有特定数据特性的大数据集。
共同学习,写下你的评论
评论加载中...
作者其他优质文章