Spark Scala - java.util.NoSuchElementException e limpeza de dados
Eu tive umproblema semelhante antes, mas estou procurando uma resposta generalizável. estou usandofaísca-corenlp para obter pontuações de sentimentos em e-mails. Às vezes, sentiment () trava em alguma entrada (talvez seja muito longo, talvez tenha um caractere inesperado). Não me diz que trava em algumas instâncias e apenas retorna oColumn sentiment('email)
. Assim, quando eu tentoshow()
além de um certo ponto ousave()
meu quadro de dados, recebo umajava.util.NoSuchElementException
Porquesentiment()
deve ter retornado nada nessa linha.
Meu código inicial está carregando os dados e aplicandosentiment()
como mostrado emspark-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
Tentei filtrar valores nulos e NaN:
val sentFiltered = sent.filter('sentiment.isNotNull)
.filter(!'sentiment.isNaN)
.filter(col("sentiment").between(0,4))
Eu até tentei fazê-lo via consulta SQL:
sent.registerTempTable("sent")
val test = sqlContext.sql("SELECT * FROM sent WHERE sentiment IS NOT NULL")
Não sei que entrada está causando a falha do spark-corenlp. Como posso descobrir? Senão, como posso filtrar esses valores inexistentes de col ("sentiment")? Ou então, devo tentar capturar a exceção e ignorar a linha? Isso é possível?