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

问题描述 投票:6回答:2

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

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

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

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

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

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

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

apache-spark
2个回答
2
投票

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

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

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

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

这是对的。

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.