Spark Scala - java.util.NoSuchElementException и очистка данных
У меня быланалогичная проблема раньше, но я ищу обобщающий ответ. я используюискровым corenlp чтобы получить оценки настроений по электронной почте. Иногда sentiment () дает сбой при вводе (возможно, он слишком длинный, возможно, он имел неожиданный характер). Он не говорит мне, что в некоторых случаях происходит сбой, а просто возвращаетColumn sentiment('email)
, Таким образом, когда я пытаюсьshow()
за определенную точку илиsave()
мой фрейм данных, я получаюjava.util.NoSuchElementException
так какsentiment()
должно быть, ничего не вернул в этом ряду.
Мой исходный код загружает данные и применяетsentiment()
как показано вspark-corenlp
API.
val customSchema = StructType(Array(
StructField("contactId", StringType, true),
StructField("email", StringType, true))
)
// Load dataframe
val df = sqlContext.read
.format("com.databricks.spark.csv")
.option("delimiter","\t") // Delimiter is tab
.option("parserLib", "UNIVOCITY") // Parser, which deals better with the email formatting
.schema(customSchema) // Schema of the table
.load("emails") // Input file
val sent = df.select('contactId, sentiment('email).as('sentiment)) // Add sentiment analysis output to dataframe
Я попытался отфильтровать значения NULL и NaN:
val sentFiltered = sent.filter('sentiment.isNotNull)
.filter(!'sentiment.isNaN)
.filter(col("sentiment").between(0,4))
Я даже пытался сделать это с помощью SQL-запроса:
sent.registerTempTable("sent")
val test = sqlContext.sql("SELECT * FROM sent WHERE sentiment IS NOT NULL")
Я не знаю, что приводит к краху spark-corenlp. Как я могу узнать? Иначе, как я могу отфильтровать эти несуществующие значения из col («настроение»)? Или я должен попытаться поймать исключение и проигнорировать строку? Это вообще возможно?