在以下示例中:
small.ints = to.dfs(1:1000)
mapreduce(
input = small.ints,
map = function(k, v) cbind(v, v^2))
mapreduce函数的数据输入是一个名为small.ints的对象,它引用了HDFS中的块。
现在我有一个已存储在HDFS中的CSV文件
"hdfs://172.16.1.58:8020/tmp/test_short.csv"
如何获取对象?
据我所知(可能是错误的),如果我想将CSV文件中的数据作为mapreduce的输入,我必须先在R中生成一个包含CSV文件中所有值的表。我确实有这样的方法:
data=from.dfs("hdfs://172.16.1.58:8020/tmp/test_short.csv",make.input.format(format="csv",sep=","))
mydata=data$val
似乎可以使用此方法获取mydata,然后执行object = to.dfs(mydata),但问题是test_short.csv文件很大,大约是TB大小,内存不能保持from.dfs !!
的输出实际上,我想知道我是否直接使用“hdfs://172.16.1.58:8020 / tmp / test_short.csv”作为mapreduce输入,而在map函数内部执行from.dfs()的事情,我能够获取数据块?
请给我一些建议,无论如何!
答案 0 :(得分:3)
mapreduce(input = path,input.format = make.input.format(...),map ...)
from.dfs用于小数据。在大多数情况下,您不会在map函数中使用from.dfs。参数保留了部分输入数据
答案 1 :(得分:0)
您可以执行以下操作:
r.file <- hdfs.file(hdfsFilePath,"r")
from.dfs(
mapreduce(
input = as.matrix(hdfs.read.text.file(r.file)),
input.format = "csv",
map = ...
))
请给出积分并希望有人发现它有用。
注意:有关详细信息,请参阅stackoverflow帖子:
How to input HDFS file into R mapreduce for processing and get the result into HDFS file