Am ani de experienta de Java 8 și lambda. Dar am întâlnit un nebun problemă atunci când am dezvoltat un salut lume-dimensiune programul Spark.
Aici am o clasa Java, în care Datele de adnotare este din Lombok:
@Data
public class Person implements Serializable {
private String name;
private Long age;
}
Și apoi am construit un java listă conținând obiecte de Persion
clasa:
Person p1 = new Person("sb", 1L);
Person p2 = new Person("sth", null);
List<Person> list = new ArrayList<>(2);
list.add(p1);
list.add(p2);
atât de bine până acum. Și apoi am încercat pentru a genera o Scânteie de Date folosind lista:
SparkSession session = SparkSession.builder().master("local[1]").appName("SparkSqlApp").getOrCreate();
Encoder<Person> personEncoder = Encoders.bean(Person.class);
Dataset<Person> dataset1 = session.createDataset(list, personEncoder);
dataset1.foreach(new ForeachFunction<Person>() { // 1
@Override
public void call(Person person) throws Exception {
System.out.println(person);
}
});
dataset1.foreach((ForeachFunction<Person>) System.out::println); //2
Observați că, blocul 1 este echivalent cu bloc 2 în java și blocul 2 este simplificată din blocul 1 de IntelliJ IDEA. Singura diferență este blocul 2 este folosind expresie lambda.
Cu toate acestea, atunci când am executa programul, bloc 1 se termină cu bine, în timp ce blocul 2 a alerga într-excepție:
Ce... mare de pământ și marele univers? De ce JVM sau Spark motor face lucruri de genul asta?!
System.out
?Și am înlocui-o cu Log-cadru și bang! Ea a reușit.ForeachFunction<String> functionBody = log::info;