1、关于map与foreach区别:
map:遍历RDD,将函数f应用于每一个元素,返回新的RDD(transformation算子);
foreach:遍历RDD,将函数f应用于每一个元素,无返回值(action算子);
2、切记:spark中对变量的修改没有原地修改,这个和Python有很大区别
(1)val amendDatas: Seq[DataFrame] = datas.indices.map(idx=>{
datas(idx).withColumn(columnName.concat("_").concat(idx.toString),getCode(datas(idx)(columnName)))
})
说明:datas原本是一个Array[DataFrame]变量,等号右边对array中的每一个元素做了transform,结果等号右边相当于形成了一个新的Array[T],但是需注意的是,如果要使用这个新的Array[T]则需要赋值给一个新的变量,原来的datas并不会被改变;
(2) var retData = amendDatas.head
Range(1,datas.length).foreach{i => {
retData = retData.join(amendDatas(i).select(idName,columnName.concat("_").concat(i.toString)),idName)
}}
说明:retData尽管被定义为var类型,仅代表它可以被重新赋值修改值,因此foreach里如果不把retData=重新赋值,它的值也是不会被改变的。