J'ai des années d'expérience de Java 8 et de son lambda. Mais j'ai rencontré un fou problème quand j'ai développé un hello-world-taille de l'Étincelle programme.
Ici, j'ai une classe Java, dans lequel les Données d'annotation est de Lombok:
@Data
public class Person implements Serializable {
private String name;
private Long age;
}
Et puis j'ai construit un java liste contenant des objets de 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);
donc bon jusqu'à présent. Et puis, j'ai essayé de générer une Étincelle Dataset à l'aide de la liste:
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
Notez que le bloc 1 est l'équivalent du bloc 2 de java et le bloc 2 est simplifiée du bloc 1 par IntelliJ IDEA. La seule différence est le bloc 2 est à l'aide d'expressions lambda.
Cependant, lorsque j'exécute le programme, le bloc 1 est bien qui finit bien, tout le bloc 2 exécuter dans l'exception:
Ce que la... grande terre et grand univers? Pourquoi la JVM ou une Étincelle moteur fait des choses comme ça?!
System.out
?Et je le remplace avec le Journal de cadre et bang! Il a réussi.ForeachFunction<String> functionBody = log::info;