一、把结果带出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
七、conf优先级
优先级最高的是在用户代码中显式调用 set() 方法设置的选项。其次是通过 spark-submit 传递的参数,再次是写在配置文件中的值,最后是系统的默认值。
八、在 conf/spark-env.sh 中将环境变量 SPARK_LOCAL_DIRS 设置为用逗号隔开的存储位置
列表,来指定 Spark 用来混洗数据的本地存储路径。这需要在独立模式和 Mesos 模式下设
置。