1. 减少client模式下的日志输出
import org.apache.log4j.{ Level, Logger }
Logger.getLogger("org").setLevel(Level.ERROR)//或者WARN
2. 判断字符串是否为整数或小数
和spark没关系,是个scala语法问题。
实际项目中涉及过滤数据质量的问题,因此综合网上看到的例子整理出一个能同时适配整数和小数的方法。
var pattern = """^[0-9]+([.]{1}[0-9]+){0,1}""".r
def isNumber(s: String) = {
s match {
case null => false
case this.pattern(_*) => true
case _ => false
}
}
3. spark传递对象的序列化的问题
原因是写了一个读取配置文件的config类,在构造函数中读取文件,然后赋值。报错:
object not serializable
原因:spark任务是由driver分配给executor的。在driver中建立的class(基本上就是各种rdd算子之外定义的class)必须通过序列化方式下发,否则就要回避这种用法:
//定义
class config extends java.io.Serializable {
def this(path: String) {
this() //调用主构造函数
//自定义构造方法
}
}
//使用
val taskconf = new config(args(0))
其他的方法(不建议用,参见后续分析):
使用object或case object,此时不能定义构造函数,但是可以自己写一个load函数。使用的时候也不用new:
//定义
object config {
def load(path: String) {
}
}
//使用
val taskconf = config
taskconf.load(args(0))
//或者直接用config
相当于实现了一个静态类,而且感觉作为一个只读的配置类,这样搞就够了。
ps. 经过后续测试,object对象往execu