将DataFrame的数据带回本地节点,以便在spark / scala

时间:2017-09-16 12:56:30

标签: scala apache-spark spark-dataframe

我在Scala中使用Spark 1.6。

我知道Spark框架背后的一些想法。但是我不能通过阅读不同的教程来回答这个问题......(也许是错误的教程)。

我将两个DataFrame加入了一个新的( nDF )。现在我知道,它还没有继续进行,只要我说,首先或计数。

但是由于我想要做到这一点,我想以不同的方式检查nDF:

nDF.show
nDF.count
nDF.filter()

..等等,每次都需要很长时间,因为原始的DataFrames很大。无法将数据带到/复制到新的数据。所以我可以像原始套装那样快速地解决这些新动作吗? (首先我认为它'收集',但它只返回一个数组,没有DataFrame)

2 个答案:

答案 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一次并将结果数据帧存储在内存中。因此,后续行动会更快。

然而,第一次评估可能会慢一些,你还需要使用更少的执行程序内存。