Scala Spark行级错误处理

时间:2015-08-08 00:23:53

标签: scala apache-spark

我在查找如何使用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时,我得到了同样的错误。

关于这里可能出现什么问题的任何想法?

1 个答案:

答案 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日志。