由于java.lang.NullPointerException
转换中的函数抛出了map
,因此我有一个Spark作业失败的阶段。
我的想法是借助map
类型从Try
内部获取损坏的Sale对象。
因此,我有意将函数结果分配给saleOption
变量,然后进行模式匹配。
不幸的是,我当前的实现无法正常工作,我需要有关如何修复它的建议。感谢您的任何建议。
这是初始方法:
def filterSales(rawSales: RDD[Sale]): RDD[(String, Sale)] = {
rawSales
.map(sale => sale.id -> sale) // throws NullPointerException
.reduceByKey((sale1, sale2) => if (sale1.timestamp > sale2.timestamp) sale1 else sale2)
}
这是我实现我的想法的方式:
def filterSales(rawSales: RDD[Sale]): RDD[(String, Sale)] = {
rawSales
.map(sale => {
val saleOption: Option[(String, Sale)] = Try(sale.id -> sale).toOption
saleOption match {
case Success(successSale) => successSale
case Failure(e) => throw new IllegalArgumentException(s"Corrupted sale: $rawSale;", e)
}
})
.reduceByKey((sale1, sale2) => if (sale1.timestamp > sale2.timestamp) sale1 else sale2)
}
UPD::我的意图是将其用于调试目的,并提高我的Scala知识。我不会使用Try
和Exceptions
进行流量控制。
答案 0 :(得分:0)
如果您只想忽略10000
50005000
,请删除它们,不要抛出异常。例如
sum=50005000
答案 1 :(得分:0)
Try
不应用于流量控制。 Exception
仅在例外情况下使用。最好的解决方案是修复您的NullPointerException
。如果不应该有任何空值,则说明生成RDD的代码中存在错误。如果您期望潜在的空值(例如来自格式错误的输入数据),则应该使用RDD[(String,Option[Sale])]
。