spark读取外部配置的方式,
1、–files
C
O
N
F
D
I
R
/
l
o
g
4
j
.
x
m
l
,
{CONF_DIR}/log4j.xml,
CONFDIR/log4j.xml,{CONF_DIR}/default.properties,${BASE_DIR}/hbase.properties
上传多个文件,用英文逗号分隔开,文件路径必须是全路径
程序中读取的方式:
1.1、scala.io.Source.fromFile("hbase.properties").getLines().foreach(println(_))
注意这里使用文件名称读取即可,使用全路径读取报找不到此文件
需要的数据要自己写代码处理
1.2、val props = new Properties(); props.load(new FileInputStream("hbase.properties"))
使用java中Properties类读取文件,注意此处也是使用文件名,非全路径
会自动加载key=value的形式到props中
二、
spark程序中不导入import spark.implicits._隐式转换类,无法将rdd的数据集转换为DF
三、
使用typeLit对新增数据列的类型控制,如typedLitString,如果只是withColumn(“time_type”,lit(“0”)) 会自动 转换为Integer类型
四、自定义排序:// 自定义排序,sorted排序继承Ordered,需要序列化
class MySort(val id:Int,val age:Int) extends Ordered[MySort] with Serializable{
override def compare(that: MySort):Int = {
if(that.id == id){// 如果id相等,就比较年龄
age - that.age
}else{
id - that.id
}
}
}
case class Person(id:Int,age:Int,name:String)={def this()=this(null,null,null)}
val tmp=sc.parallelize(Seq(Person(1,21,“java”),Person(4,30,“c++”),Person(3,22,“python”),Person(4,22,“h5”)))
val rs=tmp.map(x=>{(new MySort(x.id,x.age),x)})
rs.sortByKey().map(_._2).collect
四、spark-submit提交程序时,使用–conf传自定义的参数时,必须使用spark.开头,程序中使用sparkConf.get(key)才能获取到,否则获取不到,spark中内部规则
五、使用withColumn、withColumnRename时,
1、迭代添加列时,需要考虑性能问题,尽量使用select转换进行代替
2、df.alias(“a”).withColumn时,使用select($“a.*”),被withColumn的列不属于别名a表的列