【问题标题】:Convert a Spark dataframe to a R dataframe [duplicate]将 Spark 数据帧转换为 R 数据帧 [重复]
【发布时间】:2019-01-16 08:06:56
【问题描述】:

我在 Zeppelin 上使用 R 来开发机器学习模型。我使用 %sparkr, sql(Constring, 'select * from table') 从 Hive 表中提取数据,默认情况下它会生成一个包含 9400 万条记录的 spark 数据框。

但是,我无法在此 Spark df 上执行所有 R 数据处理任务,因此我尝试使用 Collect(), as.data.frame() 将其转换为 R 数据帧,但我遇到了内存节点/超时问题。

我想知道堆栈溢出社区是否知道通过避免超时问题将 Spark df 转换为 R df 的任何其他方法?

【问题讨论】:

  • 根据定义,这就是拥有 R 数据框所需的内容。
  • 转换超时怎么办?
  • 那么你不应该使用这些。您可以检查gapplydapply 方法,它们以分布式方式对数据块进行操作。
  • 使用 sparklyr 包怎么样,有什么输入吗?

标签: r apache-spark apache-spark-sql apache-zeppelin sparkr


【解决方案1】:

您是否尝试先缓存 Spark 数据帧?如果您首先缓存数据,它可能有助于加快收集速度,因为数据已经在 RAM 中......这可以摆脱超时问题。同时,这只会增加您的 RAM 需求。当您尝试序列化或反序列化某些数据类型,或者只是 R 和 Spark 之间的大量数据时,我也看到了这些超时问题。大型数据集的序列化和反序列化远非 R 和 Spark 的“防弹”操作。此外,对于您的驱动程序节点来说,94M 记录可能一开始就无法处理,尤其是在您的数据集有很多维度的情况下。

我使用过的一种解决方法,但我自豪的是使用 spark 将数据帧写为 CSV,然后让 R 在下一行读回该 CSV 文件脚本。奇怪的是,在一些我这样做的情况下,写入文件和读取文件方法实际上最终比简单的collect 操作更快

忠告 - 在使用 spark 写出 csv 文件时,请务必注意分区。您将获得一堆 csv 文件,并且必须执行某种 tmp<- lapply(list_of_csv_files_from_spark, function(x){read.csv(x)}) 操作来单独读取每个 csv 文件,然后可能是 df<- do.call("rbind", tmp) ...最好使用 fread 读取csvs 也代替了read.csv

也许更好的问题是,您在 Spark 中无法执行哪些其他需要 R 的数据处理任务?

祝你好运。我希望这可以帮到你。 -nate

【讨论】:

  • 好吧,就我而言,我试图在 spark 数据帧上使用 dplyr 方法,但 Zeppelin 不允许。所以,我认为让我们将 spark df 转换为 R df 可能会解决问题,但是,我的数据很大,转换不是一个选项(至少从上面的讨论中)。似乎我找到了一种解决方法SparkR 包,其中包含 dplyr 包中的大部分方法! spark.apache.org/docs/2.3.0/api/R/select.html
  • 很高兴你能弄明白。 dplyr 和 SparkR 本质上做同样的事情......这些东西实际上只是一个 SQL 操作。 SparkR 只允许您以分布式、并行化的方式执行此操作……这仍然很酷,IMO。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 2018-08-19
  • 2021-11-16
  • 2016-09-27
  • 2020-07-24
相关资源
最近更新 更多