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