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。幸运的是,您有几个选择。
使用Apache Arrow为对象建立通用的内存格式,无需将 R 中的表示复制和转换为 Spark。我提供的 link 说明了如何在 Databricks 上进行设置。
将dataframe以parquet(或CSV)格式写入磁盘,然后直接读入Spark。您可以使用 arrow
library in R 来执行此操作。
增加驱动程序节点的大小以适应内存扩展。在 Databricks 上,您可以 select 集群的驱动程序节点类型(或要求您的管理员这样做)——确保您选择一个具有大量内存的节点类型。作为参考,我测试了收集 2GB 数据集并需要 30GB+ 驱动程序。随着箭头急剧下降。
有趣的是, 对 SparkR 将从 DataFrame 转换为 data.table 的 table 大小的限制是依赖于内存的。它也比我预期的要小,我的工作大约有 50,000 行
我不得不将一些非常大的 data.tables 转换为数据帧,最后制作了一个脚本将它们分成更小的部分来解决这个问题。最初我选择分块 n 行数据,但是当转换非常宽的 table 时返回此错误。我的解决方法是限制要转换的 元素 的数量。
我是 Stack overflow 的新手,尝试了很多方法来解决错误,但都没有成功。我的问题:我可以将 R 数据帧的子集转换为 Spark 数据帧,但不能将整个数据帧转换。类似但不相同的问题包括:
这里有一些关于 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。幸运的是,您有几个选择。
使用Apache Arrow为对象建立通用的内存格式,无需将 R 中的表示复制和转换为 Spark。我提供的 link 说明了如何在 Databricks 上进行设置。
将dataframe以parquet(或CSV)格式写入磁盘,然后直接读入Spark。您可以使用
arrow
library in R 来执行此操作。增加驱动程序节点的大小以适应内存扩展。在 Databricks 上,您可以 select 集群的驱动程序节点类型(或要求您的管理员这样做)——确保您选择一个具有大量内存的节点类型。作为参考,我测试了收集 2GB 数据集并需要 30GB+ 驱动程序。随着箭头急剧下降。
有趣的是, 对 SparkR 将从 DataFrame 转换为 data.table 的 table 大小的限制是依赖于内存的。它也比我预期的要小,我的工作大约有 50,000 行
我不得不将一些非常大的 data.tables 转换为数据帧,最后制作了一个脚本将它们分成更小的部分来解决这个问题。最初我选择分块 n 行数据,但是当转换非常宽的 table 时返回此错误。我的解决方法是限制要转换的 元素 的数量。