我有一个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中的内存中的序列化对象。所以,它永远不会给出准确的尺寸。它会在每次通话时给出不同的号码。