【问题标题】:Is there a size limit in DataBricks for converting an R dataframe to a Spark dataframe?DataBricks 中是否有将 R 数据帧转换为 Spark 数据帧的大小限制?
【发布时间】:2020-04-22 02:51:52
【问题描述】:

我是堆栈溢出的新手,尝试了很多方法来解决错误,但没有任何成功。我的问题:我可以将 R 数据帧的子集转换为 Spark 数据帧,但不能转换整个数据帧。类似但不相同的问题包括: Not able to to convert R data frame to Spark DataFrameIs 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? (之后我想保存AsTable)。 我正在考虑容量问题,但我不知道如何解决它。

非常感谢!!

【问题讨论】:

  • 我也有同样的问题。 (没有帮助,但至少您知道这似乎是一个更普遍的问题。)

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


【解决方案1】:

通常,从 R 数据帧转换为 Spark 数据帧时,您会发现性能不佳,反之亦然。在 Spark 和 R 中,对象在内存中的表示方式不同,当从一个对象转换到另一个对象时,对象大小会显着扩大。这通常会耗尽驱动程序的内存,从而难以从 Spark 复制/收集大型对象。幸运的是,您有几个选择。

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

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

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

【讨论】:

  • 非常感谢您的评论!将R数据帧转换为Spark Dataframe的原因如下:我在DataBricks中使用R进行数据操作,我想将结果保存到PowerBI。出于这个原因,我将 R 数据帧转换为 Spark 数据帧,然后使用函数 saveAsTable(需要 Spark 数据帧作为输入!)创建一个可以通过 PowerBI 访问的表。这是最佳方式(即 Rdataframe -> Sparkdataframe -> saveAsTable -> PowerBI)吗?如果是这样,那么我将应用上述选项之一。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 2016-09-27
    相关资源
    最近更新 更多