基础语法
参考:www.runoob.com/scala/scala…
方法定义
def functionName ([参数列表]) : [return type]
闭包定义
闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。
闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数。
如下面这段匿名的函数:
val multiplier = (i:Int) => i * 10
def addInt( a:Int, b:Int ) : Int = {
var sum:Int = 0
sum = a + b
return sum
}
匿名函数
=> 匿名函数,在Spark中函数也是一个对象可以赋值给一个变量。
Spark的匿名函数定义格式:
(形参列表) => {函数体}
所以,=>的作用就是创建一个匿名函数实例。
比如:(x:Int) => x +1 ,就等同于下面的Java方法:
public int function(int x) { return x+1;}
示例:
class Symbol {
var add = (x: Int) => x + 1
}
object test2 {
def main (args: Array[String] ): Unit = {
var symbol = new Symbol
printf(""+ symbol.add.toString())
}
mappartition()返回迭代器的语义是将RDD中的T类型,即其中的元素,转化为某个元素,然后返回这个元素的迭代器。
mappartitionwithindex()含义是将某个分区下的这些元素的迭代器(即其中某个参数)转化为该分区下的迭代器。 这个就是将分区下的recordItr转化为某个迭代器,其实转化为集合,然后再返回迭代器即可。 因此后面只需要关注recordItr的部分即可。
partitionedRecords.mapPartitionsWithIndex((partition, recordItr) -> {
Iterator<List<WriteStatus>> writeStatusIterator;
if (WriteOperationType.isChangingRecords(operationType)) {
writeStatusIterator = handleUpsertPartition(instantTime, partition, recordItr, partitioner);
} else {
writeStatusIterator = handleInsertPartition(instantTime, partition, recordItr, partitioner);
}
List<WriteStatus> writeStatuses = new ArrayList<>();
while (writeStatusIterator.hasNext()) {
writeStatuses.addAll(writeStatusIterator.next());
}
long totalRecordsWritten = 0;
long totalBytesWritten = 0;
long totalWriteTime = 0;
for (WriteStatus status : writeStatuses) {
totalRecordsWritten += status.getTotalRecords();
totalBytesWritten += status.getStat().getTotalWriteBytes();
totalWriteTime += status.getTotalWriteTime();
}
OutputMetrics outputMetrics = TaskContext.get().taskMetrics().outputMetrics();
outputMetrics.setRecordsWritten(totalRecordsWritten);
outputMetrics.setBytesWritten(totalBytesWritten);
outputMetrics.incWriteTime(totalWriteTime);
return writeStatuses.iterator();
}, true);
updateIndexAndCommitIfNeeded(writeStatusRDD, result);
return result;
}