如何在Java中的Apache Spark中将DataFrame转换为Dataset?

我可以很容易地将Scala中的DataFrame转换为Dataset:

case class Person(name:String, age:Long) val df = ctx.read.json("/tmp/persons.json") val ds = df.as[Person] ds.printSchema 

但在Java版本中我不知道如何将Dataframe转换为Dataset? 任何想法?

我的努力是:

 DataFrame df = ctx.read().json(logFile); Encoder encoder = new Encoder(); Dataset ds = new Dataset(ctx,df.logicalPlan(),encoder); ds.printSchema(); 

但是编译器说:

 Error:(23, 27) java: org.apache.spark.sql.Encoder is abstract; cannot be instantiated 

编辑(解决方案):

基于@Leet-Falcon的解决方案答案:

 DataFrame df = ctx.read().json(logFile); Encoder encoder = Encoders.bean(Person.class); Dataset ds = new Dataset(ctx, df.logicalPlan(), encoder); 

官方Spark文档在Dataset API中建议如下:

通过在Encoders上调用静态方法来指定Java编码

 List data = Arrays.asList("abc", "abc", "xyz"); Dataset ds = context.createDataset(data, Encoders.STRING()); 

编码器可以组成元组:

 Encoder> encoder2 = Encoders.tuple(Encoders.INT(), Encoders.STRING()); List> data2 = Arrays.asList(new scala.Tuple2(1, "a"); Dataset> ds2 = context.createDataset(data2, encoder2); 

或者由Encoders#bean的 Java Beans构建:

 Encoders.bean(MyClass.class); 

如果要将通用DF转换为Java中的数据集,可以使用如下所示的RowEncoder类

 DataFrame df = sql.read().json(sc.parallelize(ImmutableList.of( "{\"id\": 0, \"phoneNumber\": 109, \"zip\": \"94102\"}" ))); Dataset dataset = df.as(RowEncoder$.MODULE$.apply(df.schema()));