try spark catch exception scala

spark - scala try catch throw exception



¿Cómo resolver java.nio.charset.UnmappableCharacterException en Scala 2.8.0? (4)

Estoy usando Scala 2.8.0 y trato de leer un archivo delimitado por tuberías como en el código cortado a continuación:

object Main { def main(args: Array[String]) :Unit = { if (args.length > 0) { val lines = scala.io.Source.fromPath("QUICK!LRU-2009-11-15.psv") for (line <-lines) print(line) } } }

Aquí está el error:

Excepción en el hilo "main" java.nio.charset.UnmappableCharacterException: Longitud de entrada = 1 en java.nio.charset.CoderResult.throwException (CoderResult.java:261) en sun.nio.cs.StreamDecoder.implRead (StreamDecoder.java) 319) en sun.nio.cs.StreamDecoder.read (StreamDecoder.java:158) en java.io.InputStreamReader.read (InputStreamReader.java:167) en java.io.BufferedReader.fill (BufferedReader.java:136) en java.io.BufferedReader.read (BufferedReader.java:157) en scala.io.BufferedSource $$ anonfun $ 1 $$ anonfun $ apply $ 1.apply (BufferedSource.scala: 29) en scala.io.BufferedSource $$ anonfun $ 1 $ $ anonfun $ apply $ 1.apply (BufferedSource.scala: 29) en scala.io.Codec.wrap (Codec.scala: 65) en scala.io.BufferedSource $$ anonfun $ 1.apply (BufferedSource.scala: 29) en scala .io.BufferedSource $$ anonfun $ 1.apply (BufferedSource.scala: 29) en scala.collection.Iterator $$ anon $ 14.siguiente (Iterator.scala: 149) en scala.collection.Iterator $$ anon $ 2.siguiente (Iterator .scala: 745) en scala.collection.Iterator $$ anon $ 2.head (Iterator.scala: 732) en scala.col lection.Iterator $$ anon $ 24.hasNext (Iterator.scala: 405) en scala.collection.Iterator $$ anon $ 20.hasNext (Iterator.scala: 320) en scala.io.Source.hasNext (Source.scala: 209) en scala.collection.Iterator $ class.foreach (Iterator.scala: 534) en scala.io.Source.foreach (Source.scala: 143) ... en infillreports.Main $ .main (Main.scala: 8) en infillreports.Main.main (Main.scala) Resultado de Java: 1


Esta quizás una solución más genérica:

implicit val codec = Codec("UTF-8") codec.onMalformedInput(CodingErrorAction.REPLACE) codec.onUnmappableCharacter(CodingErrorAction.REPLACE)

con las dos configuraciones, puede evitar los datos mal formados en el archivo.


Estaba luchando con este mismo problema y esta respuesta me ayudó. Quería extenderme en el comentario de seh sobre el "por qué funciona esto". La respuesta debe estar en la firma del método:

def fromFile(file: JFile)(implicit codec: Codec): BufferedSource

Toma un parámetro de codec implícito. Sin embargo, en el ejemplo, se proporciona una cadena, no un códec. Una segunda traducción se está realizando entre bastidores: el objeto complementario de la clase Codec define un método de aplicación de String:

def apply(encoding: String): Codec

así que el compilador ha hecho algún trabajo para nosotros: líneas val = Source.fromFile (someFile) (Codec ("UTF-8"))

Dado que el códec es implícito, si llama a este método varias veces, también puede crear un objeto de códec en el alcance de su llamada:

implicit val codec = Codec("UTF-8") val lines = Source.fromFile(someFile) val moreLines = Source.fromFile(someOtherFile)

Espero haberlo hecho bien (todavía soy un Scala n00b, tengo mis habilidades de control, siéntase libre de corregir cuando sea necesario)


Para agregar a la respuesta de Daniel C. Sobral, también puedes probar algo como esto:

val products = Source.fromFile("products.txt")("UTF-8").getLines().toList; for(p <- products){ println("product :" + p); }


object Main { def main(args: Array[String]) :Unit = { if (args.length > 0) { val lines = scala.io.Source.fromPath("QUICK!LRU-2009-11-15.psv")("UTF-8") for (line <-lines) print(line) } } }