我在查找如何使用Scala Spark程序进行行级错误处理方面遇到了一些麻烦。在下面的代码中,我正在读取CSV文本文件,解析它,并使用mapSchema方法创建一个Row(未显示;基本上,它采用由CSV生成的字符串数组并使用模式将字符串转换为整数,双精度数,日期等。当数据格式正确时,它可以很好地工作。但是,如果我有一个错误的行 - 例如,一个字段比预期的少 - 我想执行一些错误处理。
<?php
class Star
{
const ALREADY_STARRED_ERROR = 1;
const NOT_FOUND_ERROR= 2;
const SUCCESSFUL_ENTRY = 3;
function getMessage($code)
{
$messages = [
1 => "You starred it already.",
2 => "The one you tried to star does no longer exist.",
3 => "Starred successfully!"
];
return $message[$code];
}
/**
* Add
*
* Add a star to something.
*
* @param int $ID The ID of the thing.
*/
function Add($ID)
{
if($this->Starred($ID))
return self::ALREADY_STARRED_ERROR;
if(!$this->Existing($ID))
return self::NOT_FOUND_ERROR;
$this->DB->Star($ID);
return self::SUCCESSFUL_ENTRY;
}
}
?>
问题是try / catch表达似乎不起作用。当我给它排错时,我不会得到&#34; SomeError&#34; RuntimeException的。相反,当我不使用try / catch时,我得到了同样的错误。
关于这里可能出现什么问题的任何想法?
答案 0 :(得分:4)
您需要查看日志的正确位置。首先:捕获确实有效。以下是spark-shell的一个例子:
val d = sc.parallelize(0 until 10)
val e = d.map{ n =>
try {
if (n % 3==0) throw new IllegalArgumentException("That was a bad call")
println(n)
} catch {
case e: IllegalArgumentException => throw new UnsupportedOperationException("converted from Arg to Op except")
}
}
e.collect
结果如下:注意异常被正确捕获和转换:
org.apache.spark.SparkException: Job aborted due to stage failure: Task 5 in
stage 0.0 failed 1 times, most recent failure: Lost task 5.0 in
stage 0.0 (TID 5, localhost):
java.lang.UnsupportedOperationException: converted from Arg to Op except
at $anonfun$1.apply$mcVI$sp(<console>:29)
at $anonfun$1.apply(<console>:24)
at $anonfun$1.apply(<console>:24)
尝试查看一个或多个工作人员的stderr
日志。