Scala, Spark:一些小坑

来源:互联网 发布:淘宝买账号的靠谱吗 编辑:程序博客网 时间:2024/05/29 18:29

Scala, Spark:一些小坑


在开发Spark Job的过程中,遇到了一些很低级的小坑,不是自己不知道这个知识点,只是 没有过于专注。现把这些错误记录下来,以后尽量少范这种错误,以表警示。

scala: map.get

Scala有一个Option类,他有2个子类,Some和None,其设计的上的就是为了减少Java中 null 使用的次数。Scala的mutable.HashMap 的 get方法,返回就是Option[T]类型的子类。如果key存在,则返回Some(值),如果不存在返回:None。
之前一直开发Java程序,直接使用.get方法返回就是想要的值,但在Scala中,这点是比较容易出错的。如果get的值需要 和a,b,c 累加 成字符串,值的结果就是 a,b,c,Some(value),这样就会导致程序错误,其实我们想要的值是: a,b,c,value

def main(args: Array[String]): Unit = {    var map = mutable.HashMap[String, String]()    map.+=(("a" -> "1"))    println(map.get("a"))    println(map.get("b"))}结果:Some(1)None

spark: map,flatMap等 算子最后返回值

Scala语言把函数的最后一句当做返回值, 就是不强制使用return语句。这点上,也容易范一些小错误,比如我下面的程序。愿意是想返回log对象,但是错误的理解为 “log.att = XXX ” 之后 还可以返回Log对象,其实返回的是Unit,程序运行没有错误,但结果总是不对。

sparkContext.textFile(inputPath).flatMap(x => {  Log.readFromString(x)}).map(log => {  val atts: Array[String] = log.att.split(",")  val sb: StringBuilder = new StringBuilder  for (att <- atts) {    if (attrComMapBroad.value.contains(att)) {      sb.append(attrComMapBroad.value.get(att).get)    } else {      sb.append(att)    }    sb.append(",")  }  log.att = sb.substring(0, sb.length - 1)   log // 此句最容易忘记,把上一句,log.att = 当做返回值,返回的结果是unit类型的}).filter(_.isKept).saveAsTextFile(outputPath, classOf[GzipCodec])
原创粉丝点击