如何在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()));
- 使用saveAsTextFile的Spark NullPointerException
- 无法使用Java连接到HBase
- 使用Mongo-Hadoop连接器通过Apache Spark更新MongoDb中的集合
- 如何使用Java中的Structured Streaming从Kafka反序列化记录?
- 如何读取嵌套的JSON以进行聚合?
- 如何使用Java在Spark SQL中加入多列以在DataFrame中进行过滤
- PySpark:java.lang.OutofMemoryError:Java堆空间
- 基于第二个Dataframe的DataFrame过滤
- Apache Spark需要5到6分钟才能从Cassandra中简单计算1亿行