16

DataFrame を Scala の 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<Person> encoder = new Encoder<>();
Dataset<Person> ds = new Dataset<Person>(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<Person> encoder = Encoders.bean(Person.class);
Dataset<Person> ds = new Dataset<Person>(ctx, df.logicalPlan(), encoder);
4

2 に答える 2

14

公式の Spark ドキュメントでは、Dataset APIで次のことを提案しています。

Java エンコーダーは、Encodersで静的メソッドを呼び出すことによって指定されます。

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

エンコーダーはタプルに構成できます。

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

または、 Encoders#beanによって Java Beans から構築されます。

Encoders.bean(MyClass.class);
于 2016-01-07T12:03:40.017 に答える
6

汎用 DF を Java の Dataset に変換する場合は、以下のように RowEncoder クラスを使用できます。

DataFrame df = sql.read().json(sc.parallelize(ImmutableList.of(
            "{\"id\": 0, \"phoneNumber\": 109, \"zip\": \"94102\"}"
    )));

    Dataset<Row> dataset = df.as(RowEncoder$.MODULE$.apply(df.schema()));
于 2016-10-27T06:15:19.600 に答える