Yes, it's necessary to cast the lambda in Java as (MapFunction<X,Y>) in many cases. This is because the Scala-specific and Java-specific versions of .map() both end up accepting a function object that the lambda can match, and an Encoder. What I'd have to go back and look up is why that would be different in Spark 3; some of that has always been the case with Java 8 in Spark 2. I think it might be related to Scala 2.12; were you using Spark 2 with Scala 2.11 before?
On Sat, Dec 28, 2019 at 11:38 AM Jean-Georges Perrin <j...@jgp.net> wrote: > > Hey guys, > > This code: > > Dataset<Row> incrementalDf = spark > .createDataset(l, Encoders.INT()) > .toDF(); > Dataset<Integer> dotsDs = incrementalDf > .map(status -> { > double x = Math.random() * 2 - 1; > double y = Math.random() * 2 - 1; > counter++; > if (counter % 100000 == 0) { > System.out.println("" + counter + " darts thrown so far"); > } > return (x * x + y * y <= 1) ? 1 : 0; > }, Encoders.INT()); > > used to work with Spark 2.x, in the two previous, it says: > > The method map(Function1<Row,Integer>, Encoder<Integer>) is ambiguous for the > type Dataset<Row> > > IfI define my mapping function as a class it works fine. Here is the class: > > private final class DartMapper > implements MapFunction<Row, Integer> { > private static final long serialVersionUID = 38446L; > > @Override > public Integer call(Row r) throws Exception { > double x = Math.random() * 2 - 1; > double y = Math.random() * 2 - 1; > counter++; > if (counter % 1000 == 0) { > System.out.println("" + counter + " operations done so far"); > } > return (x * x + y * y <= 1) ? 1 : 0; > } > } > > Any hint on what/if I did wrong? > > jg > > > --------------------------------------------------------------------- To unsubscribe e-mail: dev-unsubscr...@spark.apache.org