2015-06-01 2 views
0

Мне нужно прочитать несколько файлов csv и преобразовать несколько столбцов из строки в Double.Confused with Spark serilization

код, как:

def f(s:String):Double = s.toDouble 

    def readonefile(path:String) = { 
    val data = for { 
     line <- sc.textFile(path) 
     arr = line.split(",").map(_.trim) 
     id = arr(33) 
    } yield { 
     val countings = ((9 to 14) map arr).toVector map f 
     id -> countings.toVector 
     } 
    data 
    } 

Если я пишу toDouble явно (например функцию f в коде), искра бросает ошибку java.io.IOException или java.lang.ExceptionInInitializerError.

Однако, если я изменю countings к

val countings = ((9 to 14) map arr).toVector map (_.toDouble)

Тогда все работает отлично.

Является функцией f сериализуемым?

EDIT:

Некоторые люди говорит, что это то же самое, как Task not serializable: java.io.NotSerializableException when calling function outside closure only on classes not objects Но почему это не бросить Task not serializable исключение?

Scala версия 2,10

Спарк версия 1.3.1

Окружающая среда: пряжа-клиент

+1

возможно дубликат [задача не сериализуемый: java.io.NotSerializableException при вызове функции вне закрытия только на классах не объекты] (http://stackoverflow.com/questions/22592811/task-not-serializable-java-io-notserializableexception-when-calling-function-ou) – maasg

+0

@maasg, хотя они похожи. Но как объяснить сообщение об ошибке, которое оно выбрасывает. Я ожидал увидеть NotSerializableException. – worldterminator

+0

Я немного путаюсь с основным циклом, который вы делаете, можете ли вы объяснить, что вы пытаетесь выполнить? – Holden

ответ

0

Мы можем переместить функцию F в объект компаньона. Я также сделал преобразования, чтобы избежать цикла for, который я не уверен, что он делает то, что вы хотите. Обратите внимание, что вы можете использовать искровой CSV вместо того, чтобы просто разделив на запятых, но, надеюсь, это иллюстрирует это:

object Panda { 
    def f(s:String):Double = s.toDouble 
    } 

    def readonefile(path:String) = { 
     val input = sc.textFile(path) 
     arrs = input.map(line => line.split(",").map(_.trim)) 
     arrrs.map(arr => (arr(33).toDouble, 
         ((9 to 14) map arr).map(Panda.f).toVector) 
    } 
+0

Привет @Holden, я не видел, как он решил мою проблему. Почему программа бросает java.io.IOException или java.lang.ExceptionInInitializerError? – worldterminator

+0

Он помещает f в объект кемпинга. – Holden

+0

Прежде всего, я не уверен, что вызывает ошибку, возможную проблему сериализации. И почему объект-компаньон может его исправить? – worldterminator