将 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 中?