У меня есть многолетний опыт работы с Java 8 и ее лямбдой. Но я столкнулся с безумной проблемой, когда разработал программу Spark размером с hello world.
Здесь у меня есть класс Java, в котором аннотации данных взяты с Ломбока:
@Data
public class Person implements Serializable {
private String name;
private Long age;
}
А затем я создал список java, содержащий объекты Persion
класс:
Person p1 = new Person("sb", 1L);
Person p2 = new Person("sth", null);
List<Person> list = new ArrayList<>(2);
list.add(p1);
list.add(p2);
пока все идет хорошо. А затем я попытался создать набор данных Spark, используя список:
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
Обратите внимание, что блок 1 эквивалентен блоку 2 в java, а блок 2 упрощен по сравнению с блоком 1 с помощью IntelliJ IDEA. Единственное отличие в том, что в блоке 2 используется лямбда-выражение.
Однако, когда я выполняю программу, блок 1 заканчивается хорошо, в то время как блок 2 выполняется в исключении:
Что за... большая земля и большая вселенная? Почему JVM или двигатель Spark делают такие вещи?!
System.out
?И я заменяю его рамкой журнала и бац! Это удалось.ForeachFunction<String> functionBody = log::info;