如果我可以将用户定义的函数用于RDD

时间:2016-01-06 06:33:57

标签: scala apache-spark

我想使用md5函数来RDD [(String,Array [Double])],但是有一个错误 空指针异常。我发现堆栈溢出的问题。call of distinct and map together throws NPE in spark library

我的代码:

def md5(s: String) = {
    MessageDigest.getInstance("MD5").digest(s.getBytes).
           map("%02x".format(_)).mkString.substring(0,8)
  }

val rdd=sc.makeRDD(Array(1,8,6,4,9,3,76,4))//.collect().foreach(println)
val rdd2 = rdd.map(r=>(r+"s",Array(1.0,2.0)))

rdd2.map{
  case(a,b) => (md5(a)+"_"+a,b)
}.foreach(println)

在本地模式下,没关系,但在群集模式下,它出错了。

 java.lang.NullPointerException

我可以采用其他方式吗? thx:)

错误:

Exception in thread "main" java.lang.NullPointerException                       
    at no1.no1$.no1$no1$$md5$1(no1.scala:139)
    at no1.no1$$anonfun$8.apply(no1.scala:143)
    at no1.no1$$anonfun$8.apply(no1.scala:141)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
    at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:108)
    at no1.no1$.main(no1.scala:141)
    at no1.no1.main(no1.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:665)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:170)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:193)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:112)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

上面的代码就是一个例子,但这段代码似乎是正确的。我很困惑。

1 个答案:

答案 0 :(得分:0)

我认为RDD没有办法为你的MD5功能提供null字符串,而且显然内部失败了:

  

显示java.lang.NullPointerException
      at no1.no1 $ .no1 $ no1 $$ md5 $ 1(no1.scala:139)< - here!

我的钱就是静态调用MessageDigest.getInstance("MD5")正在执行者身上返回null。那个或.digest电话。检查可能发生的情况,也许您在本地尝试的输入不包含故障情况。