将Spark数据框转换为R数据框

时间:2018-08-09 00:02:20

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

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

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

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

1 个答案:

答案 0 :(得分: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)……最好使用{{ 1}}也可以代替fread读取csvs。

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

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