Ho anni di esperienza di Java 8 e la sua lambda. Ma ho incontrato un pazzo problema quando ho sviluppato un ciao-mondo-dimensioni Scintilla programma.
Qui ho una classe Java, in cui i Dati di annotazione è da Lombok:
@Data
public class Person implements Serializable {
private String name;
private Long age;
}
E poi ho costruito un java elenco contenente gli oggetti di Persion
classe:
Person p1 = new Person("sb", 1L);
Person p2 = new Person("sth", null);
List<Person> list = new ArrayList<>(2);
list.add(p1);
list.add(p2);
così bene finora. E poi ho provato a generare una Scintilla set di dati utilizzando l'elenco:
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
Si noti che il blocco 1 è equivalente al blocco 2 in java e il blocco 2 è semplificato dal blocco 1 da IntelliJ IDEA. L'unica differenza è il blocco 2 utilizza espressione lambda.
Tuttavia, quando ho eseguito il programma, blocco 1 finisce bene, mentre il blocco 2, in deroga:
Che... che grande terra e grande universo? Perché la JVM o Spark fa cose come questa?!
System.out
?Io e sostituirlo con Registro quadro e bang! E ' riuscito.ForeachFunction<String> functionBody = log::info;