spark 小技巧

来源:互联网 发布:珂润水乳怎么样知乎 编辑:程序博客网 时间:2024/06/13 02:53

一、把结果带出foreach

val e= b.map(f⇒{        var dbConnector:GraphDatabaseConnector=new Neo4jConnector();        val eachList=dbConnector.getPersonSimList(f._1)      dbConnector.finalize()        dbConnector=null        //直接返回就ok      eachList    })

二、scala中如果直接return,返回的是整个方法的返回值,而不是方法里的某个lambda表达式的返回值,所以不用写return,直接最后将结果单独作为一行返回就行
同时,如果要返回多个值的话,直接

//方法的头部是这样的:(Long,Long)= //返回值这样return (a,b)

三、没事不要多加括号

val points2 = Array(Array((9.0,3.9,4.7)), Array(( 7.0,2.0,2.9)), Array(( 5.6,5.0,6.9)), Array((6.3,2.0,9.9)))val points2: Array[Array[(Double, Double, Double)]]val points2 = Array(Array(9.0,3.9,4.7), Array(7.0,2.0,2.9), Array(5.6,5.0,6.9), Array(6.3,2.0,9.9))val points2: Array[Array[Double]]

四、要将partition里的数据合并成一个

val rdd1MapParRDD = rdd1.mapPartitions(f ⇒ {        var buf1 = scala.collection.mutable.ArrayBuffer.empty[Float]        //       var resultMap = Map[String,Array[Float]]()        //       var result = List[Array[Float]]()        var result = scala.collection.mutable.ArrayBuffer.empty[Array[Float]]        //        f.map(f⇒{        while (f.hasNext) {          buf1.appendAll(f.next()._2)        }        //        })        val arr = buf1.toArray        //        arr.iterator        //        result.::(arr).iterator        result.+=(arr).iterator        //        arr.toIterator      })

五、当查看lib的路径感觉有问题时,可以打印运行时的路径,然后把lib放在对应路径下

String classpathString=System.getProperty("java.class.path");System.out.println("classpathString:"+classpathString);

六、使用log

@transient  val logger:Logger=new ConsoleLogger()

log需要实现Serializable接口,但是在spark中没用,必须要加上@transient,同时,如果使用mapPartition这类的,由于log没有被分发,所以在work节点上是没有log这个类的,需要在mapPartition中new 一个log