我们可以使用sizeestimator.estimate来估计rdd/Dataframe的大小吗?

ppcbkaq5  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(349)

我有一个数据框架,它将由hivecontext通过执行一个配置单元sql来创建,在我的例子中,查询的数据应该被推送到不同的数据存储中。
由于我正在尝试执行的sql,dataframe有数千个分区。
将数据推到我使用的数据存储 mapPartitions() 获取连接并推送数据。
数据目的地上的负载非常高,因为分区的数量太多了 coalsec() 根据Dataframe的大小将分区数设置为所需的计数。
在我的所有案例中,sql生成的数据量都不相同。在少数情况下,可能只有几百条记录,在少数情况下可能达到几百万条。因此,我需要一种动态的方法来决定要创建的分区的数量 coalsec() .
在谷歌搜索之后,我发现我们可以使用 SizeEstimator.estimate() 估计Dataframe的大小,然后根据一些计算将计数除以以得到分区数。但从实施的Angular 来看 SizeEstimator.estimate spark的repo向我展示了它是针对单个jvm的观点实现的,应该用于广播变量等对象,而不是分布在jvm上的rdd/dataframe。
有人能建议如何解决我的问题吗?如果我的理解有误,请告诉我。

uxhixvfz

uxhixvfz1#

我们可以使用sizeestimator.estimate来估计rdd/Dataframe的大小吗?
不,我们不能用来估计rdd或Dataframe的大小。它会有不同的尺寸。
如果磁盘上有拼盘文件。。您可以使用estimate根据您可以决定的分区数来知道文件的确切大小。。。
spark的repo向我展示了它是针对单个jvm的观点实现的,应该用于广播变量等对象,而不是分布在jvm上的rdd/dataframe
这是正确的。
请参阅spark sizeestimatorsuite.scala中的测试类以更好地理解它。。。

fnx2tebb

fnx2tebb2#

不,sizeestimator.estimate不能用于估计rdd/Dataframe的大小。
原因是spark在创建rdd/dataframe并对其执行操作时使用它来估计java对象的大小。它使用基本的java大小方法来查找java对象的大小。
在查找rdd/dataframe(rdd上的抽象)的大小时,它们是分布在JVM中的内存中的序列化对象。所以,它永远不会给出准确的尺寸。它会给每个电话不同的号码。

相关问题