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

时间:2016-10-28 15:51:45

标签: apache-spark

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

  

我们可以使用SizeEstimator.estimate估算大小   RDD /数据帧?

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

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

  

spark的回购告诉我,它已经针对单个JVM实现了   站在观点上,应该用于像广播这样的对象   变量等,但不适用于分布的RDD / DataFrame   跨越JVM

这是对的。

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

答案 1 :(得分:0)

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

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

在查找RDD / DataFrame的大小时(相对于RDD而言),它们是在JVM中分布的内存中的序列化对象。因此,它永远不会给出准确的大小。每次通话都会给出不同的号码。

相关问题