我在Scala中使用Spark 1.6。
我知道Spark框架背后的一些想法。但是我不能通过阅读不同的教程来回答这个问题......(也许是错误的教程)。
我将两个DataFrame加入了一个新的( nDF )。现在我知道,它还没有继续进行,只要我说,首先或计数。
但是由于我想要做到这一点,我想以不同的方式检查nDF:
nDF.show
nDF.count
nDF.filter()
..等等,每次都需要很长时间,因为原始的DataFrames很大。无法将数据带到/复制到新的数据。所以我可以像原始套装那样快速地解决这些新动作吗? (首先我认为它'收集',但它只返回一个数组,没有DataFrame)
答案 0 :(得分:0)
如果您可以使用的内存与数据集的大小相符,那么您可能正在寻找的内容是df.cache()
。如果数据集的大小太大,请考虑使用df.persist()
,因为它允许不同级别的持久性。
希望这是你正在寻找的东西。干杯
答案 1 :(得分:0)
这是一个经典的场景。当你加入2个Dataframes时,spark不会做任何操作,因为当一个动作调用结果数据帧时,它会懒惰地计算。动作意味着显示,计数,打印等。
现在当show,count被调用 nDF 时,spark每次都会评估结果数据帧,即当你调用show时,然后调用count等等。这意味着每次在结果数据帧上调用操作时,它都在内部执行map / reduce。
Spark不会将结果数据帧缓存在内存中,除非通过执行df.cache / df.persist暗示这样做。
所以当你这样做时
val nDF = a.join(b).persist
然后调用count / show它将评估nDF一次并将结果数据帧存储在内存中。因此,后续行动会更快。
然而,第一次评估可能会慢一些,你还需要使用更少的执行程序内存。