Java 8 ve lambda konusunda uzun yıllara dayanan tecrübem var. Ama dünya çapında bir Kıvılcım programı geliştirdiğimde çılgınca bir sorunla karşılaştım.
Burada, Veri ek açıklamasının Lombok'tan olduğu bir Java sınıfım var:
@Data
public class Person implements Serializable {
private String name;
private Long age;
}
Ve sonra nesneleri içeren bir java listesi oluşturdum Persion
sınıf:
Person p1 = new Person("sb", 1L);
Person p2 = new Person("sth", null);
List<Person> list = new ArrayList<>(2);
list.add(p1);
list.add(p2);
iyi şimdilik. Ve sonra listeyi kullanarak bir Spark Veri Kümesi oluşturmaya çalıştım:
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
Blok 1'in java'daki blok 2'ye eşdeğer olduğuna ve blok 2'nin IntelliJ IDEA tarafından blok 1'den basitleştirildiğine dikkat edin. Tek fark, blok 2'nin lambda ifadesini kullanmasıdır.
Ancak, programı yürüttüğümde, blok 2 istisnada çalışırken blok 1 iyi bitiyor:
Ne... büyük dünya ve büyük evren mi? JVM veya Spark motoru neden böyle şeyler yapıyor?!
System.out
?Ve onu Log framework ve bang ile değiştiriyorum! Başardı.ForeachFunction<String> functionBody = log::info;