Spark输出JSON与Parquet文件大小差异

时间:2018-08-13 16:46:27

标签: apache-spark parquet

这里有新的Spark用户。我找不到关于Spark和同一数据帧通过Spark的镶木地板输出之间的文件大小比较的任何信息。

现在使用很小的数据集进行测试,先执行df.toJSON()。collect(),然后写入磁盘,然后创建一个15kb的文件。但是执行df.write.parquet会创建105个文件,每个文件的大小约为1.1kb。为什么在这种情况下,实木复合地板的文件总大小比JSON大得多?

预先感谢

2 个答案:

答案 0 :(得分:0)

柯南,很难在不知道数据性质的情况下准确地回答您的问题(您甚至不知道DataFrame中的行数)。但是让我推测一下。

首先。包含JSON的文本文件通常在磁盘上占用的空间要多于实木复合地板。至少当一个商店存储了数千亿行时。原因是实木复合地板是高度优化的基于列的存储格式,该格式使用二进制编码来存储数据

第二。我猜您有一个非常小的数据框,具有105个分区(可能有105行)。当您存储较小的磁盘空间时,应该不会打扰您,但是如果这样做,您需要知道每个实木复合地板文件都有一个相对较大的标题,用于描述您存储的数据。

答案 1 :(得分:0)

您使用df.toJSON.collect的目的是从所有数据中获得一个JSON(在您的情况下为15kb),然后将其保存到磁盘上-对于您想使用的情况,这不是可扩展的以任何方式发火花。

为了保存镶木地板,您正在使用spark内置功能,并且由于某种原因,您似乎有105个分区(可能是您进行操作的结果),因此您获得了105个文件。这些文件中的每一个都有文件结构的开销,并且可能存储0,1或2条记录。如果要保存一个文件,则应在保存之前合并(1)(同样,这仅适用于您拥有的玩具示例),因此您将获得1个文件。请注意,由于文件格式的开销,它可能还会更大(即,开销可能仍然大于压缩优势)