当前位置: 首页 > 知识库问答 >
问题:

带有空数据集的Spark SQL联接会导致输出文件大小更大

汪阳飇
2023-03-14

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

基本上,我有两个数据集,其中一个非常大,另一个是空的。我遍历并选择了大数据集中的几乎所有列,并将其完全外部连接到空数据集中。然后,我将结果数据集写到Snappy压缩的parquet(我也尝试了Snappy压缩的orc)。或者,我只需从大型数据集中选择相同的列,然后将生成的数据集保存为快速压缩的parquet(或orc),如上所示。文件大小截然不同,因为来自空数据集联接的文件几乎是简单选择文件的五倍。

我在许多不同的数据集上尝试过,得到了相同的结果。在查看数据方面:

    null

共有1个答案

子车才捷
2023-03-14

在遇到其他几种情况后,在处理数据的方式上看似很小的差异导致文件大小的巨大差异(对于看似完全相同的数据),我终于明白了这一点。

这里的关键是理解parquet(或orc)如何使用字典编码、游程编码等复杂的格式对数据进行编码。这些格式利用数据冗余来减小文件大小,也就是说,如果数据包含许多相似的值,则文件大小将小于许多不同的值。

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

 类似资料:
  • 我只使用了库中的几个实际类,即: 提前道谢。

  • 问题内容: 当我使用套接字编程传输大文件时,收到的文件不完整,即它是一个mp3文件,当我播放时听起来很奇怪。代码是: 服务器端: 客户端: 在客户端,我只是为了简化而使用(我可以从服务器端发送文件的长度)。 如果客户端和服务器是同一台机器,则此代码可以完美地工作,但是如果它们位于不同的机器上,则文件会失真。 问题答案: 在Java中复制流的规范方法: 适用于大于零的任何缓冲区大小。应避免避免将缓冲

  • 可能没有多少开发人员像我一样面临这个问题<但是我想分享我已经解决了将近一个月的解决方案 我使用Kubernetes和docker compose,此Webflux服务(容器)设置了内存限制1g

  • 问题是输出文件的大小大于原始文件 编辑:-我知道的解决方案,即读写文件字节明智,但我的问题是为什么这是发生的?

  • 问题内容: 我尝试从我的汇编代码中使用,这是一个最小示例,应仅打印到stdout: 我用 当我运行它时,它似乎可以正常工作:该字符串已打印出来,退出状态为: 但是当我尝试捕获文本时,很明显,某些功能无法正常工作: 该变量应具有值,但为空。 我的用法有什么问题? 问题答案: 使用 诸如printf之类的stdio函数后,请使用而不是原始syscall。 正如Michael解释的那样,可以动态链接C库

  • 根据Android版本/设备品牌,文件浏览器打开,我得到以下结果: 从中选择文件: 从<code>Fotos</code>中选择文件: 从<code>FileCommander</code>中选择文件: 我可以打开所有这些文件,除非我尝试从< code >下载、、< code >音频、< code>Afbeeldingen(图像)中打开文件 很可能我无法处理这种Uri: 我尝试了以下方法: > 尝