将 DataFrame 的数据带回本地节点以在 spark/scala 中执行进一步操作(计数/显示)

Posted

技术标签:

【中文标题】将 DataFrame 的数据带回本地节点以在 spark/scala 中执行进一步操作(计数/显示)【英文标题】:Bring data of DataFrame back to local node for further actions (count / show) in spark/scala 【发布时间】:2017-09-16 12:56:29 【问题描述】:

我在 Scala 中使用 Spark 1.6。

我知道这是 Spark 框架背后的一些想法。但是我无法通过阅读不同的教程来回答自己..(可能是错误的)。

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

但由于我想这样做,我想以不同的方式检查 nDF:

nDF.show
nDF.count
nDF.filter()

..等等,每次都需要很长时间,因为原始 DataFrame 很大。我不能将数据带到/复制到这个新的。所以我可以像在原始场景中一样快速解决这些新动作吗? (一开始我以为是'collect',但它只返回一个数组,没有DataFrame)

【问题讨论】:

为什么不cache 感谢@zero323,我一直在寻找,只是找不到。 【参考方案1】:

这是一个经典场景。当您加入 2 Dataframes 时,spark 不会执行任何操作,因为它会在对结果 dataframe 调用操作时懒惰地进行评估。动作意味着展示、计数、打印等。

现在在 nDF 上调用 show,count,spark 每次都会评估结果数据帧,即当你调用 show 时,然后在调用 count 时等等。这意味着每次在结果数据帧上调用操作时,它都会在内部执行 map/reduce。

Spark 不会在内存中缓存生成的数据帧,除非通过 df.cache / df.persist 提示这样做。

所以当你这样做时

val nDF = a.join(b).persist

然后调用 count/show 它将评估一次 nDF 并将结果数据帧存储在内存中。因此后续操作会更快。

但是第一次评估可能会慢一点,你也需要使用更多的执行器内存。

【讨论】:

【参考方案2】:

如果您的可用内存相对于数据集的大小来说是不错的,那么您可能正在寻找的是df.cache()。如果您的数据集太大,请考虑使用df.persist(),因为它允许不同级别的持久性。

希望这是您正在寻找的。干杯

【讨论】:

以上是关于将 DataFrame 的数据带回本地节点以在 spark/scala 中执行进一步操作(计数/显示)的主要内容,如果未能解决你的问题,请参考以下文章

如何处理空的“DataFrame”:没有数字数据来绘制错误以在图表上获取字符串

如何在 DataFrame 中将 Column 声明为分类特征以在 ml 中使用

如何在每个 Worker 中的 Spark Dataframe 中加载数据,以防止将大量数据加载到 Master 节点

如何将本地 csv 文件的内容保存到“硬编码”Pandas DataFrame 中?

Dataframe.toPandas 总是在驱动节点还是工作节点上?

从 php url 获取数据以在 react native 中保存到本地 sqlite