我有一个DataFrame,它将由hiveContext通过执行Hive SQL创建,在我的情况下,查询的数据应该被推送到不同的数据存储区。
由于我正在尝试执行的SQL,DataFrame有数千个分区。
要将数据推送到数据存储区,我使用coalsec()
并获取连接并推送数据。
由于分区数量的原因,数据目标上的负载非常高,我可以根据DataFrame的大小coalsec()
分区数到所需的数量。
SQL生成的数据量在我的所有情况下都不相同。在少数情况下,它可能只有几百个记录,在极少数情况下可能会达到几百万个。因此,我需要一种动态方式来确定SizeEstimator.estimate()
的分区数。
在谷歌搜索后,我可以看到我们可以使用SizeEstimator.estimate
来估计DataFrame的大小,然后根据一些计算划分计数以获得分区数。但是在spark's repo处查看getCheckObservable()
的实现表明,它已经针对单个JVM立场实现,并且应该用于广播变量等对象,但不能用于RDD / DataFrames。分布在JVM上。
有人可以建议如何解决我的问题吗?如果我的理解是错误的,请告诉我。
答案 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中分布的内存中的序列化对象。因此,它永远不会给出准确的大小。每次通话都会给出不同的号码。