Mám dlouholeté zkušenosti z Java 8 a jeho lambda. Ale potkal jsem šílený problém, když jsem vyvinul hello-world-size Spark program.
Tady mám Java třídy, ve kterém Dat anotace je z Lombok:
@Data
public class Person implements Serializable {
private String name;
private Long age;
}
A pak jsem se postavil java seznam obsahující objekty Persion
třída:
Person p1 = new Person("sb", 1L);
Person p2 = new Person("sth", null);
List<Person> list = new ArrayList<>(2);
list.add(p1);
list.add(p2);
zatím je to dobré. A pak jsem se snažil generovat Jiskru Dataset pomocí seznamu:
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
Všimněte si, že blok 1 je ekvivalentní bloku 2 v jazyce java a blok 2 je zjednodušený z bloku 1 do IntelliJ IDEA. Jediný rozdíl je, že blok 2 je pomocí lambda výrazu.
Nicméně, když jsem se spustit program, blok 1 končí dobře, zatímco blok 2 spustit v výjimkou:
Co... na velkou zemi a velký vesmír? Proč JVM nebo Zapalovací motor dělá věci, jako je tento?!
System.out
?A já jej nahradit Protokol rámce, a bang! To se mu podařilo.ForeachFunction<String> functionBody = log::info;