R+Hadoop: как читать CSV-файл из HDFS и выполнять mapreduce?
В следующем примере:
small.ints = to.dfs(1:1000)
mapreduce(
input = small.ints,
map = function(k, v) cbind(v, v^2))
ввод данных для функции mapreduce-это объект с именем small.ints, которые ссылались на блоки в HDFS.
Теперь у меня есть файл CSV, уже хранящийся в HDFS как
"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-файл огромен, что составляет около размера ТБ,и память не может содержать выходные данные.ДФС!!
на самом деле, мне интересно, использую ли я "hdfs://172.16.1.58:8020/tmp/test_short.csv " как MapReduce ввода непосредственно, и внутри функции карты сделать из.DFS () вещь, я могу получить блоки данных?
пожалуйста, дайте мне совет, все равно!
2 ответов
mapreduce(input = путь, вход.format = make.вход.формат.(..), карта. ..)
from.dfs предназначен для небольших данных. В большинстве случаев вы не будете использовать.dfs в функции карты. Аргументы содержат часть входных данных уже
вы можете сделать что-то вроде ниже:
r.file <- hdfs.file(hdfsFilePath,"r")
from.dfs(
mapreduce(
input = as.matrix(hdfs.read.text.file(r.file)),
input.format = "csv",
map = ...
))
пожалуйста, дайте очки и надеюсь, кто-нибудь найдет его полезным.
Примечание: Для деталей см. столб stackoverflow:
как ввести файл HDFS в R mapreduce для обработки и получить результат в файл HDFS