Tengo años de experiencia en Java 8 y su lambda. Pero conocí a un loco problema cuando he desarrollado un hola-mundo-el tamaño de la Chispa del programa.
Aquí tengo una clase de Java, en el que los Datos de la anotación es de Lombok:
@Data
public class Person implements Serializable {
private String name;
private Long age;
}
Y, a continuación, he construido un java de la lista que contiene los objetos de Persion
clase:
Person p1 = new Person("sb", 1L);
Person p2 = new Person("sth", null);
List<Person> list = new ArrayList<>(2);
list.add(p1);
list.add(p2);
tan bueno, tan lejos. Y entonces traté de generar una Chispa conjunto de datos utilizando la 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
Observe que, el bloque 1 es equivalente a la del bloque 2 en java y el bloque 2 es simplificado del bloque 1 por IntelliJ IDEA. La única diferencia es el bloque 2 es el uso de la expresión lambda.
Sin embargo, cuando ejecuto el programa, bloque 1 termina bien, mientras que el bloque 2 de ejecución de excepción:
Lo que el... grande de la tierra y del universo grande? ¿Por qué la JVM o Chispa del motor hace cosas como esta?!
System.out
?Y puedo reemplazar con Registro de marco y ¡bang! Fue un éxito.ForeachFunction<String> functionBody = log::info;