我们可以使用SizeEstimator.estimate估算RDD / DataFrame的大小吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我们可以使用SizeEstimator.estimate估算RDD / DataFrame的大小吗?相关的知识,希望对你有一定的参考价值。

我有一个DataFrame,它将由hiveContext通过执行Hive SQL创建,在我的情况下,查询的数据应该被推送到不同的数据存储区。

由于我试图执行的SQL,DataFrame有数千个分区。

要将数据推送到数据存储区,我使用mapPartitions()并获取连接并推送数据。

由于分区的数量,数据目标上的负载非常高,我可以根据DataFrame的大小将分区数量coalsec()到所需的计数。

在我的所有情况下,SQL生成的数据量并不相同。在少数情况下,它可能只有几百个记录,在极少数情况下可能会达到几百万个。因此,我需要一种动态的方式来决定coalsec()的分区数量。

在谷歌搜索后,我可以看到我们可以使用SizeEstimator.estimate()估计DataFrame的大小,然后根据一些计算划分计数以获得分区数。但是在SizeEstimator.estimate上查看spark's repo的实现表明,它已经针对单个JVM立场实现,并且应该用于广播变量等对象,而不是用于分布在JVM上的RDD / DataFrame。

任何人都可以建议如何解决我的问题?如果我的理解是错误的,请告诉我。

答案

我们可以使用SizeEstimator.estimate估算RDD / DataFrame的大小吗?

不,我们无法用于估计RDD或Dataframe的大小。它会给出不同的尺寸。

如果你在磁盘上有一个镶木地板文件..你可以根据你可以决定的分区数量使用估计来知道文件的确切大小...

spark的repo向我展示了它已经实现了单个JVM立场的观点,应该用于广播变量等对象,但不能用于分布在JVM上的RDD / DataFrames

这是对的。

请参阅spark SizeEstimatorSuite.scala中的测试类以更好地理解它...

另一答案

不,SizeEstimator.estimate不能用于估计RDD / DataFrame的大小。

原因是Spark在创建RDD / DataFrame并对其进行操作时使用它来估计java对象的大小。它使用基本的java size方法来查找java对象的大小。

在查找RDD / DataFrame的大小(RDD上的抽象)时,它们是分布在JVM中的内存中的序列化对象。所以,它永远不会给出准确的尺寸。它会在每次通话时给出不同的号码。

以上是关于我们可以使用SizeEstimator.estimate估算RDD / DataFrame的大小吗?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以使用“NullCompactionStrategy”吗?

我们可以使用我们的开发证书重新签署应用商店构建吗?

反射。使用它我们可以实现啥?

我们可以对非游戏应用使用“请求”吗?

我们可以使用 ionic 框架将视频存储在 sqlite 数据库中吗?如果可以,我们如何存储它?

为什么优先级队列是使用堆实现的,当我们可以更有效地使用向量实现它时