DataBricks 中是否存在将 R 数据帧转换为 Spark 数据帧的大小限制?

Is there a size limit in DataBricks for converting an R dataframe to a Spark dataframe?

我是 Stack overflow 的新手,尝试了很多方法来解决错误,但都没有成功。我的问题:我可以将 R 数据帧的子集转换为 Spark 数据帧,但不能将整个数据帧转换。类似但不相同的问题包括: Is there any size limit for Spark-Dataframe to process/hold columns at a time?

这里有一些关于 R 数据帧的信息:

library(SparkR)
sparkR.session()
sparkR.version()
[1] "2.4.3"

dim(df)
[1] 101368     25
class(df)
[1] "data.frame"

将其转换为 Spark Dataframe 时:

sdf <- as.DataFrame(df)
Error in handleErrors(returnStatus, conn) : Error in handleErrors(returnStatus, conn) : 
Error in handleErrors(returnStatus, conn) : 

但是,当我对 R 数据帧进行子集化时,它不会导致错误:

sdf_sub1 <- as.DataFrame(df[c(1:50000), ])
sdf_sub2 <- as.DataFrame(df[c(50001:101368), ])

class(sdf_sub1)
[1] "SparkDataFrame"
attr(,"package")
[1] "SparkR"

class(sdf_sub2)
[1] "SparkDataFrame"
attr(,"package")
[1] "SparkR"

如何将整个数据帧写入 Spark DataFrame? (之后我想 saveAsTable )。 我正在考虑容量问题,但我不知道如何解决它。

非常感谢!!

通常,从 R 数据帧转换为 Spark 数据帧时,您会发现性能不佳,反之亦然。在 Spark 和 R 中,对象在内存中的表示方式不同,并且在从一个对象转换为另一个对象时,对象大小会显着增加。这经常会耗尽驱动程序的内存,导致难以 copy/collect 大对象 to/from Spark。幸运的是,您有几个选择。

  1. 使用Apache Arrow为对象建立通用的内存格式,无需将 R 中的表示复制和转换为 Spark。我提供的 link 说明了如何在 Databricks 上进行设置。

  2. 将dataframe以parquet(或CSV)格式写入磁盘,然后直接读入Spark。您可以使用 arrow library in R 来执行此操作。

  3. 增加驱动程序节点的大小以适应内存扩展。在 Databricks 上,您可以 select 集群的驱动程序节点类型(或要求您的管理员这样做)——确保您选择一个具有大量内存的节点类型。作为参考,我测试了收集 2GB 数据集并需要 30GB+ 驱动程序。随着箭头急剧下降。

有趣的是, 对 SparkR 将从 DataFrame 转换为 data.table 的 table 大小的限制是依赖于内存的。它也比我预期的要小,我的工作大约有 50,000 行

我不得不将一些非常大的 data.tables 转换为数据帧,最后制作了一个脚本将它们分成更小的部分来解决这个问题。最初我选择分块 n 行数据,但是当转换非常宽的 table 时返回此错误。我的解决方法是限制要转换的 元素 的数量。