【问题标题】:Spark SQL join with empty dataset results in larger output file sizeSpark SQL join 与空数据集导致更大的输出文件大小
【发布时间】:2017-09-09 20:12:45
【问题描述】:

我遇到了一个问题,显然在 Spark SQL 中对空表执行完全外连接会导致文件大小比简单地从其他数据集中选择列而不执行连接要大得多。

基本上,我有两个数据集,一个非常大,另一个是空的。我浏览并从大型数据集中选择了几乎所有列,并将其完全外连接到空数据集中。然后,我将生成的数据集写入 snappy-compressed parquet(我也尝试过 snappy-compressed orc)。或者,我只是从大型数据集中选择相同的列,然后将生成的数据集保存为如上所述的 snappy-compressed parquet(或 orc)。文件大小完全不同,因为来自空数据集连接的文件几乎是简单选择文件的五倍。

我已经在许多不同的数据集上进行了尝试,并得到了相同的结果。在查看数据时:

  • 输出行数相同(使用 spark-shell 通过读入输出数据集并进行计数来验证)
  • 架构相同(使用 spark-shell、parquet-tools 和 orc-tools 验证)
  • 抽查数据看起来是一样的,我在这两种类型的输出中都没有看到任何疯狂的数据
  • 我使用相同的 snappy 压缩显式保存了所有文件,并且 Spark 为输出文件提供了“.snappy.parquet”扩展名

我知道对空表进行联接实际上是没有意义的(我这样做是作为一些通用代码的一部分,这些代码总是执行完全外部联接,有时会遇到空数据集)。而且,我已经更新了我的代码,所以它不再这样做了,所以问题已经解决了。

不过,我想了解为什么/如何会发生这种情况。所以我的问题是——为什么使用空数据集进行 Spark SQL 连接会导致文件更大?和/或任何关于如何找出导致生成的镶木地板文件如此大的原因的任何想法也会有所帮助。

【问题讨论】:

    标签: apache-spark apache-spark-sql parquet


    【解决方案1】:

    在遇到其他几种情况,在处理数据的方式中看似微小的差异会导致文件大小的巨大差异(对于看似完全相同的数据),我终于弄明白了。 p>

    这里的关键是了解 parquet(或 orc)如何使用可能复杂的格式(例如字典编码、运行长度编码等)对数据进行编码。这些格式利用数据冗余来减小文件大小,即,如果您的数据包含许多相似的值,文件大小将小于许多不同的值。

    在与空数据集连接的情况下,重要的一点是,当 spark 进行连接时,它在连接列上进行分区。因此,即使使用空数据集进行连接,也可能会改变数据的分区方式。

    在我的例子中,加入一个空数据集将分区从在每个分区中组合在一起的许多相似记录更改为在每个分区中组合许多不同记录的分区。然后,当这些分区被写出时,许多相似或不同的记录被放在每个文件中。当分区有相似的记录时,parquet的编码效率很高,文件大小很小;当分区多样化时,parquet 的编码效率不会那么高,而且文件大小会更大——即使整体数据完全相同。

    如上所述,我们遇到了其他几个出现相同问题的实例 - 我们会更改处理的一个方面,并会获得相同的输出数据,但文件大小可能会大四倍。有助于弄清楚这一点的一件事是使用 parquet-tools 查看低级文件统计信息。

    【讨论】:

      猜你喜欢
      • 2019-01-20
      • 1970-01-01
      • 2016-01-24
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 2019-11-10
      • 2013-02-05
      • 2018-11-30
      相关资源
      最近更新 更多