在HDFS上写入R data.frame

在HDFS上写入R data.frame,r,hdfs,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,

背景

我使用以下命令读取了一个文件:

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而设计的

我尝试过但没有成功的事情

我试图通过
write.csv
write.table
重新绘制
fwrite
,但我得到了相同的错误


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

为什么它不工作

我假设fwrite()来自
data.table
。如果是这样的话,它希望打开一个不同的文件句柄,并且不接受这样的指令,即它应该将数据推送到您指定的管道中,而不是一个文件。base::file()有点幸运,因为它专门查找和处理管道案例(如文档中所述)

如果确实需要使用data.table::fwrite()

您可以编写一个除了data.table::fwrite()调用之外完全静默的Rscript(或littler),而不使用任何参数(将输出打印到stdout),并将该脚本的结果通过管道传输到hdfs命令

如果您愿意接受其他方法

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_谢谢,是的,我说的是
data.table::fwrite
。我想使用它,因为它比write.csv快得多。关于fwrite:根据你的建议,我做到了:
p\u注意:使用这种方法,
fwrite
write.csv
快4倍,比
write\u csv
快3倍。@Emmanuel Lin Sharp thinking!这是一项伟大的工作。我没有想到水槽()。也许有更好的办法,但我们目前所知有限。
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)