用于加载RDD或捕获错误并创建RDD的Scala代码模式?
我想加载一个RDD,或者如果加载失败,创建RDD。我认为下面的代码可以工作,但即使sc.textFile()在try块中,它仍然失败。我遗漏了什么,或者如何正确地做到这一点?谢谢用于加载RDD或捕获错误并创建RDD的Scala代码模式?,scala,apache-spark,Scala,Apache Spark,我想加载一个RDD,或者如果加载失败,创建RDD。我认为下面的代码可以工作,但即使sc.textFile()在try块中,它仍然失败。我遗漏了什么,或者如何正确地做到这一点?谢谢 // look for my RDD, load or make it val rdddump = "hdfs://localhost/Users/data/hdfs/namenode/myRDD.txt" val myRdd = try { sc.textFile(rdddump) } catch { ca
// look for my RDD, load or make it
val rdddump = "hdfs://localhost/Users/data/hdfs/namenode/myRDD.txt"
val myRdd = try {
sc.textFile(rdddump)
} catch {
case _ : Throwable => {
println("failed to load RDD from HDFS")
val newRdd = [....code to make new RDD here...]
newRdd.saveAsTextFile(rdddump)
newRdd
}
}
println(myRdd)
println("RDD count = " + myRdd.count)
错误如下所示
org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://localhost/Users/data/hdfs/namenode/myRDD.txt
at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:251)
at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:270)
at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:175)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:204)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:202)
at scala.Option.getOrElse(Option.scala:120)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:202)
at org.apache.spark.rdd.MappedRDD.getPartitions(MappedRDD.scala:28)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:204)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:202)
at scala.Option.getOrElse(Option.scala:120)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:202)
at org.apache.spark.SparkContext.runJob(SparkContext.scala:1097)
at org.apache.spark.rdd.RDD.count(RDD.scala:861)
...
您在错误的位置捕获了异常,堆栈跟踪清楚地显示了该异常。调用
sc.textFile
除了声明某个操作和RDD之间的关系外,什么都不做。例如,没有任何东西会触发计算,从而导致它检查输入是否存在。您在错误的位置捕获了异常,堆栈跟踪清楚地显示了该异常。调用sc.textFile
除了声明某个操作和RDD之间的关系外,什么都不做。例如,没有任何东西会触发计算,从而导致它检查输入是否存在。是的,当执行myRdd关系以获取计数时,由于最后一行代码而发生异常。我原以为这一尝试仍然有效。有没有办法在try/catch中强制执行或以其他方式解决问题?谢谢你必须执行一个操作,比如计数。您可以这样做只是为了引出错误。但这样做会浪费精力。相反,尝试捕获对计数的“真实”调用?是的,当执行myRdd关系以获取计数时,由于最后一行代码而发生异常。我原以为这一尝试仍然有效。有没有办法在try/catch中强制执行或以其他方式解决问题?谢谢你必须执行一个操作,比如计数。您可以这样做只是为了引出错误。但这样做会浪费精力。相反,试着抓住你的“真实”电话来计数?