RDD Operations - Passing Functions to Spark
23 August 2019
Spark의 API는 클러스터 위에서 동작하기 위해서 driver프로그램의 passing function에 크게 의존합니다.
Java에서 함수는 org.apache.spark.api.java.function 패키지의 인터페이스를 구현하는 클래스로 표시됩니다.
이러한 기능을 만드는 방법에는 두 가지가 있습니다.
- 익명의 내부 클래스 또는 명명 된 클래스로 자체 클래스에서 함수 인터페이스를 구현하고 해당 인스턴스를 Spark에 전달하십시오.
- lambda expression을 사용하여 구현을 간결하게 정의하십시오.
이 가이드의 대부분은 간결성을 위해 람다 구문을 사용하지만, 동일한 API를 모두 긴 형식으로 사용하는 것 역시 쉽습니다.
예를 들어, 다음과 같이 코드를 작성할 수 있습니다.
JavaRDD<String> lines = sc.textFile("data.txt");
JavaRDD<Integer> lineLengths = lines.map(new Function<String, Integer>() {
public Integer call(String s) { return s.length(); }
});
int totalLength = lineLengths.reduce(new Function2<Integer, Integer, Integer>() {
public Integer call(Integer a, Integer b) { return a + b; }
});
또는 함수를 인라인으로 작성하는 것이 다루기 힘든 경우 :class GetLength implements Function<String, Integer> {
public Integer call(String s) { return s.length(); }
}
class Sum implements Function2<Integer, Integer, Integer> {
public Integer call(Integer a, Integer b) { return a + b; }
}
JavaRDD<String> lines = sc.textFile("data.txt");
JavaRDD<Integer> lineLengths = lines.map(new GetLength());
int totalLength = lineLengths.reduce(new Sum());
Java의 익명 내부 클래스는 final로 표시되어있는 한 둘러싸는 범위의 변수에 액세스 할 수도 있습니다.Spark는 다른 언어와 마찬가지로 이러한 변수의 사본을 각 worker node에 제공합니다.
참조 : https://spark.apache.org/docs/2.1.1/programming-guide.html#passing-functions-to-spark