【问题标题】:Writing on HDFS an R data.frame在 HDFS 上写入 R data.frame
【发布时间】:2017-12-12 13:52:54
【问题描述】:

背景

我设法用命令读取了一个文件:

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.csvwrite.table 替换fwrite,但我得到了同样的错误。

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

【问题讨论】:

    标签: r hdfs


    【解决方案1】:

    为什么它不起作用

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

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

    您可以编写一个完全静默的 Rscript(或更小的),除了在没有任何参数的情况下调用 data.table::fwrite() (这会将输出打印到标准输出)并将该脚本的结果通过管道传输到您的 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_in <- pipe('/usr/bin/hdfs dfs -copyFromLocal -f - /pathToMyfile/test2.csv', 'w')
    sink(file = p_in)
    data.table::fwrite(dataSet)
    sink()
    close(p_in)
    

    ... 效果很好(结合了这个答案和上一个答案)。我在此处将其提升为我的答案,以防万一有人在 cmets 中错过它。

    如果您有耐心并且不介意 rJava 使分叉成为不可能

    正如@rob 在他们的回答中所说,RevolutionAnalytics 在这些方面有some code。你说你不能安装它,所以它可能不是这个问题的真正“答案”。但是,其他人可能有同样的问题,没有同样的限制,所以我把它放在这里。

    请注意,this question 的建议是从已测试/官方的releasesinstallation instructions 安装。

    最近,Microsoft 一直在将 RevolutionAnalytics 链接切换到他们自己的东西上(他们前几天不小心炸毁了 MRAN)。所以,我不确定该链接有多稳定和/或您是否可以相信它是并且将被维护(该回购的最后一次提交是 4 年前,但同一个家庭中的其他东西收到了约 2 或 3 次提交几年前)。看起来@piccolbo 是该软件包的贡献者,并且一直活跃在 StackOverflow 上,也许他们会评论该软件包是否具有长期支持/已经坚如磐石。

    【讨论】:

    • 谢谢,是的,我说的是data.table::fwrite。我想使用它,因为它比 write.csv 快。
    • 关于 fwrite:根据你的建议我做了:p_in &lt;- pipe('/usr/bin/hdfs dfs -copyFromLocal -f - /pathToMyfile/test2.csv', 'w'); sink(file = p_in); fwrite(dataSet); sink(); close(p_in) 是你建议的,有没有更好的方法?
    • 注意:使用这种方法,fwritewrite.csv 快 4 倍,比 write_csv 快 3 倍
    • @Emmanuel-Lin 思维敏锐!这是一个很好的解决方法。我没有想到 sink()。可能有更好的方法,但我们目前的知识有限。
    猜你喜欢
    • 1970-01-01
    • 2017-04-14
    • 2020-06-11
    • 2019-12-21
    • 2023-03-09
    • 1970-01-01
    • 2022-01-05
    • 2014-07-27
    • 2020-10-09
    相关资源
    最近更新 更多