2015-12-09 5 views
0

Je suis actuellement confronté à une erreur mentionnée ci-dessous qui est liée à la coercition de valeurs NULL dans une trame de données . L'ensemble de données contient des valeurs nulles, mais j'ai essayé les deux fonctions is.na() et is.null() pour remplacer les valeurs nulles par quelque chose d'autre. Les données sont stockées sur hdfs et sont stockées dans un format pig.hive. J'ai également joint le code ci-dessous. Le code fonctionne bien si je supprime v [, 25] de la clé.Erreur dans as (x, class (k)): pas de méthode ou par défaut pour contraindre "NULL" à "data.frame"

code:

AM = c("AN"); 
UK = c("PP"); 
sample.map <- function(k,v){ 
key <- data.frame(acc = v[!which(is.na(v[,1],1], 
        year = substr(v[!which(is.na(v[,1]),2],1,4), 
        month = substr(v[!which(is.na(v[,1]),2],5,6)) 
value <- data.frame(v[,3],count=1) 
keyval(key,value) 
} 

sample.reduce <- function(key,v){ 
    AT <- sum(v[which(v[,1] %in% AM=="TRUE"),2]) 
    UnknownT <- sum(v[which(v[,1] %in% UK=="TRUE"),2]) 
    Total <- AT + UnknownT 
    d <- data.frame(AT,UnknownT,Total) 
    keyval(key,d) 
} 
out <- mapreduce(input ="/user/hduser/input", 
      output = "/user/hduser/output", 
      input.format = make.input.format("pig.hive", sep = "\u0001")        
      output.format = make.output.format("csv", sep = ","), 
      map= sample.map) 
      reduce = sample.reduce) 

Erreur:

Warning in asMethod(object) : NAs introduced by coercion 
Warning in split.default(1:rmr.length(y), unique(ind), drop = TRUE) : data length is not a multiple of split variable 
Warning in rmr.split(x, x, FALSE, keep.rownames = FALSE) : number of items to replace is not a multiple of replacement length Warning in  split.default(1:rmr.length(y), unique(ind), drop = TRUE) : 
data length is not a multiple of split variable 
Warning in rmr.split(v, ind, lossy = lossy, keep.rownames = TRUE) : number of items to replace is not a multiple of replacement length 
Error in as(x, class(k)) :  
no method or default for coercing “NULL” to “data.frame” 
Calls: <Anonymous> ... apply.reduce -> c.keyval -> reduce.keyval -> lapply -> FUN -> as No traceback available 

MISE À JOUR J'ai ajouté les données d'échantillon et édité le code ci-dessus. J'espère que cela t'aides!

données Exemple:

NULL,"2014-03-14","PP" 
345689202,"2014-03-14","AN" 
234539390,"2014-03-14","PP" 
123125444,"2014-03-14","AN" 
NULL,"2014-03-14","AN" 
901828393,"2014-03-14","AN" 
+1

Ceci n'est pas reproductible. S'il vous plaît, faites-le. –

+0

Salut Roman, Est-ce que ça aide? Je voulais aussi mentionner que les données sont stockées sur hdfs et cet instantané est anonymisé. Mais ça ressemble à quelque chose comme ça. –

Répondre

1

Il y a quelques issues avec as qui ont été récemment identifiés. Je ne vois pas pourquoi as ne peut pas gérer cela par défaut, mais vous pouvez modifier coerce qui gère la conversion avec une méthode S4 pour appeler as.data.frame.

setMethod("coerce",c("NULL","data.frame"), function(from, to, strict=TRUE) as.data.frame(from)) 
[1] "coerce" 
as(NULL,"data.frame") 
data frame with 0 columns and 0 rows 
+0

Où dois-je exécuter ce code? A partir de maintenant mon environnement hadoop contient 3 nœuds de travail qui ont des paquets R et Rmr2 installés. Devrais-je lancer ceci sur tous ces nœuds? Aussi dois-je exécuter cette méthode chaque fois que je lance le script? Désolé d'avoir posé trop de questions. –

+0

Oui, il doit être exécuté par chaque travailleur qui aura besoin d'utiliser la méthode. Il est probablement préférable de le mettre dans un fichier .profile pour l'exécuter au démarrage. – James

+0

Cela a fonctionné! J'ai ajouté cela au fichier .profile et j'ai redémarré ma session R. Merci James pour la réponse rapide :) –