2015-02-10 2 views
2

Я попытался принятым решением в How do I convert csv file to rdd, я хочу, чтобы распечатать все пользователь, кроме «ОМ»:Convert CSV для РДА

val csv = sc.textFile("file.csv") // original file 
val data = csv.map(line => line.split(",").map(elem => elem.trim)) //lines in rows 
val header = new SimpleCSVHeader(data.take(1)(0)) // we build our header with the first line 
val rows = data.filter(line => header(line,"user") != "om") // filter the header out 
val users = rows.map(row => header(row,"user") 
users.collect().map(user => println(user)) 

, но я получил ошибку:

java.util.NoSuchElementException: key not found: user 

Стараюсь отлаживать его и найти index атрибуты header выглядеть следующим образом: enter image description here

Так как я новичок искры и Scala, означает ли это, т шляпа user уже есть в Map? Тогда почему ошибка key not found?

+1

Я не могу воспроизвести вашу проблему. В REPL он возвращает: 'Array [String] = Array (user, daniel, 3754978)'. BTW, я думаю, вы все равно хотите отфильтровать заголовок, выполнив 'data.filter (line => header (строка,« пользователь »)! =« Пользователь »))' – maasg

+0

вы могли бы добавить первые строки данных в файл? – maasg

+0

@maasg, Спасибо за ваши комментарии. Я узнал о своей ошибке, это не проблема с искрами/scala, это ошибка, когда я создал csv, я объясню больше в моем ответе ниже. – user3684014

ответ

2

Я узнал свою ошибку. Это не относится к Spark/Scala. Когда я создал пример CSV, я использую команду в R:

df <- data.frame(user=c('om','daniel','3754978'),topic=c('scala','spark','spark'),hits=c(120,80,1)) 
write.csv(df, "df.csv",row.names=FALSE) 

но write.csv добавит " вокруг факторов по умолчанию, так вот почему карта не может найти ключ user, потому что "user" является реальным ключом, используя

write.csv(df, "df.csv",quote=FALSE, row.names=FALSE) 

решит эту проблему.

0

Я переписал образец кода, чтобы удалить метод заголовка. IMO, этот пример представляет собой пошаговое руководство, которое легче выполнить. Here is a more detailed explanation.

def main(args: Array[String]): Unit = { 
    val csv = sc.textFile("/path/to/your/file.csv") 

    // split/clean data 
    val headerAndRows = csv.map(line => line.split(",").map(_.trim)) 
    // get header 
    val header = headerAndRows.first 
    // filter out header 
    val data = headerAndRows.filter(_(0) != header(0)) 
    // splits to map (header/value pairs) 
    val maps = data.map(splits => header.zip(splits).toMap) 
    // filter out the 'om' user 
    val result = maps.filter(map => map("user") != "om") 
    // print result 
    result.foreach(println) 
}