我有过一次之前有类似问题,但我正在寻找一个普遍的答案。我在用火花核心LP获取电子邮件的情绪分数。有时,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("sentiment") 中过滤这些不存在的值?否则,我应该尝试捕获异常并忽略该行吗?这可能吗?