我正在使用RHadoop rhdfs包来对具有大量列的CSV输入文件执行降维。输出将是所有列的选定子集。为简单起见,我想尝试只获取CSV文件的前5列。
我正在尝试应用mapreduce函数来使用MR框架执行降维,并使用HDFS存储而不是任何内存中处理。
我的代码如下:
transfer.csvfile.hdfs.to.hdfs.reduced =
function(hdfsFilePath, hdfsWritePath, reducedCols=1) {
local.matrix = as.numeric()
hdfs.get(hdfsFilePath, local.Matrix, srcFS=hdfs.defaults("fs"))
transfer.reduced.map =
function(.,M) {
label <- M[,1]
reduced.predictors <- M[,1:reducedCols]
reduced.M <- cbind(reduced.predictors, label)
keyval(
1,
as.numeric(reduced.M[,-1]))
}
reduced.values =
values(
from.dfs(
mapreduce(
local.matrix,
map = function(.,M) {
label <- M[,1]
reduced.predictors <- M[,1:reducedCols]
reduced.M <- cbind(reduced.predictors, label)
keyval(
1,
as.numeric(reduced.M[,-1]))}
)))
to.dfs(reduced.values)
}
它使用具有预测变量列和标记列的列车数据集作为最后一个。我正在尝试的是将预测变量的数量从100减少到5,将cbind
类标签列减少到减少的预测变量,最后将减少的训练数据集存储到hdfs中。
现在我将hdfs文件存储在名为local.matrix
的本地矩阵中,这需要我将整个文件存储在内存中。有没有办法可以使用
local.matrix
to.dfs(local.matrix)
然后将local.matrix的HDFS存储位置hdfsWritePath
传递到transfer.csvfile.hdfs.to.hdfs.reduced function
?