在HDFS上写入R data.frame

时间:2017-12-12 13:52:55

标签: r hdfs

背景

我设法用命令读取文件:

dataSet = fread("/usr/bin/hadoop fs -text /pathToMyfile/test.csv")

我的问题:

我想把它(经过一些转换)写入test2:

fwrite(dataSet, file = "| /usr/bin/hadoop dfs -copyFromLocal  -f  - /pathToMyfile/test2.csv")

我的错误:

但是这会引发以下错误:

Error in fwrite(dataSet, file = "| /usr/bin/hadoop dfs -copyFromLocal  -f  - /pathToMyfile/test2.csv") : 
  No such file or directory: '| /usr/bin/hadoop dfs -copyFromLocal  -f  - /pathToMyfile/test2.csv'. Unable to create new file for writing (it does not exist already). Do you have permission to write here, is there space on the disk and does the path exist?

我成功尝试的东西

我通过使用R函数write

进行测试得到了我的命令
write("test", file =  "| /usr/bin/hadoop fs -copyFromLocal  -f  - /pathToMyfile/test2.csv",)

这项工作非常完美(意味着我有写作权限)。

请注意,这里我正在写一个字符串,因为write不是为了写data.frame而设计的。

我尝试过没有成功的东西

我尝试按fwritewrite.csv重新write.table,但我也遇到了同样的错误。

我知道rhdfs包存在,但我无法安装

1 个答案:

答案 0 :(得分:3)

为什么它不起作用

我假设fwrite()来自data.table。如果是这样,它想要打开一个不同的文件句柄,并且不采用指令而不是文件,它应该将数据推送到您指定的管道中。你有点使用base :: file(),因为它专门查找和处理管道情况(正如它在文档中所述)。

如果你真的需要使用data.table :: fwrite()

除了data.table :: fwrite()而没有任何args(将输出打印到stdout)并将该脚本的结果传递给你的hdfs命令之外,你可以写一个完全静默的Rscript(或者更小)

如果您对其他方法持开放态度

write.csv()和readr :: write_csv()都接受连接,你可以用pipe()来解决问题。它可能就像......一样简单。

p_in <- pipe('/usr/bin/hadoop dfs -copyFromLocal  -f  - /pathToMyfile/test2.csv', 'w')
write.csv(dataSet, p_in)
close(p_in)

......但可能没有。 :)

提问者报告......

p_in <- pipe('/usr/bin/hdfs dfs -copyFromLocal -f - /pathToMyfile/test2.csv', 'w')
sink(file = p_in)
data.table::fwrite(dataSet)
sink()
close(p_in)

......效果很好(结合这个答案和前一个答案)。我把它提升到了我的答案,以防有人在评论中错过了它。

如果您有耐心并且不介意rJava制作叉子

正如@rob在答案中所说,RevolutionAnalytics沿着这些方向some code。你说你无法安装它,所以它可能不是一个真正的答案&#39;对于这个问题。但是,其他人可能会有相同的问题,没有相同的限制,所以我把它包括在这里。

请注意,this question的建议是从经过测试/正式releasesinstallation instructions安装。

最近,微软一直在将RevolutionAnalytics链接转换为他们自己的东西(他们在前几天意外地让MRAN麻烦)。所以,我不确定这个链接是多么稳定和/或你是否相信它是并且将被维护(最后一次提交到那个回购是4年前,但同一家族的其他东西都收到了提交~2或3年前)。看起来@piccolbo是该软件包的贡献者并且一直活跃在StackOverflow上,也许他们会评论该软件包是否具有长期支持/已经坚如磐石。