Domanda

Sto cercando di capire il codice RIDUCER.R prelevato dal seguente sito web.

http://www.thecloudavenue. COM / 2013/10 / MAPREDUUCE-Programmazione-in-R-Uso-hadoop.html

Questo codice utilizza per lo streaming didoop usando r.

Ho dato il codice qui sotto:

    #! /usr/bin/env Rscript
    # reducer.R - Wordcount program in R
    # script for Reducer (R-Hadoop integration)

    trimWhiteSpace <- function(line) gsub("(^ +)|( +$)", "", line)

    splitLine <- function(line) {
      val <- unlist(strsplit(line, "\t"))
      list(word = val[1], count = as.integer(val[2]))
    }

    env <- new.env(hash = TRUE)
    con <- file("stdin", open = "r")

    while (length(line <- readLines(con, n = 1, warn = FALSE)) > 0) {
     line <- trimWhiteSpace(line)
     split <- splitLine(line)
     word <- split$word
     count <- split$count

    if (exists(word, envir = env, inherits = FALSE)) {
      oldcount <- get(word, envir = env)
      assign(word, oldcount + count, envir = env)
      }
      else assign(word, count, envir = env)
      }
    close(con)

    for (w in ls(env, all = TRUE))
      cat(w, "\t", get(w, envir = env), "\n", sep = "")
.

Qualcuno potrebbe spiegare il significato dell'uso del seguente comando new.env e il successivo uso dell'Invio nel codice:

    env <- new.env(hash = TRUE)
.

Perché è richiesto? Cosa succede se questo non è incluso nel codice?

Aggiornamento 06/05/2014

Ho provato a scrivere un'altra versione di questo codice senza avere un nuovo ambiente definito e ha dato il codice come segue:

    #! /usr/bin/env Rscript
    current_word <- ""
    current_count <- 0
    word <- ""

    con <- file("stdin", open = "r")

    while (length(line <- readLines(con, n = 1, warn = FALSE)) > 0) 
    {
      line1 <- gsub("(^ +)|( +$)", "", line)
      word <- unlist(strsplit(line1, "[[:space:]]+"))[[1]]
      count <- as.numeric(unlist(strsplit(line1, "[[:space:]]+"))[[2]])

      if (current_word == word) {
        current_count = current_count + count
      } else 
      {
    if(current_word != "")     
        {
           cat(current_word,'\t', current_count,'\n')
        }    
        current_count = count
        current_word = word
      }
    }

    if (current_word == word) 
    {
      cat(current_word,'\t', current_count,'\n')
    }

    close(con)
.

Questo codice fornisce la stessa uscita di quella con un nuovo ambiente definito.

Domanda: l'utilizzo di un nuovo ambiente fornisce alcun vantaggio da un punto di vista di Hadoop? C'è una ragione per usarlo in questo caso specifico?

Grazie.

È stato utile?

Soluzione

La tua domanda è correlata all'ambiente in r, codice di esempio per creare un nuovo ambiente in R

> my.env <- new.env()
> my.env
<environment: 0x114a9d940>
> ls(my.env)
character(0)
> assign("a", 999, envir=my.env)
> my.env$foo = "This is the variable foo."
> ls(my.env)
[1] "a"   "foo"
.

Penso che questo articolo possa aiutarti a http://www.r-bloggers .com / ambienti-in-r / o premere

?environment
.

per ulteriori informazioni

Mi piace sul codice che dai, l'autore crea un nuovo ambiente.

 env <- new.env(hash = TRUE)
.

Quando vuole assegnare valore hanno definito l'ambiente

assign(word, oldcount + count, envir = env)
.

E per la domanda "Cosa succede se questo non è incluso nel codice?" Penso che tu possa trovare la risposta sul link che ho già fornito

Informazioni sui vantaggi che utilizzano il nuovo ENV in R è già stato risposto in Questo link

Quindi il motivo è in questo caso giocherai con il grande set di dati, quando si passa il set di dati sulla funzione, r farà una copia del set di dati e quindi i dati di ritorno sovrascriveranno il vecchio set di dati. Ma se si passa ENV, R procederà direttamente quel ENV senza copiare il set di dati ampio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top