Javaでは、RowFactory.create()を使用して行を作成します。
Row row = RowFactory.create(record.getLong(1), record.getInt(2), record.getString(3));
ここで、「record」はデータベースからのレコードですが、「record」の長さが事前にわからないため、リストまたは配列を使用して「行」を作成します。 Scalaでは、Row.fromSeq()を使用してリストまたは配列から行を作成できますが、Javaでそれを実現するにはどうすればよいですか?
多くの場合、実際のアプリケーションでデータセットまたはデータフレームを作成する必要があります。 Javaアプリケーションで行とデータセットを作成する方法の例は次のとおりです。
// initialize first SQLContext
SQLContext sqlContext = ...
StructType schemata = DataTypes.createStructType(
new StructField[]{
createStructField("NAME", StringType, false),
createStructField("STRING_VALUE", StringType, false),
createStructField("NUM_VALUE", IntegerType, false),
});
Row r1 = RowFactory.create("name1", "value1", 1);
Row r2 = RowFactory.create("name2", "value2", 2);
List<Row> rowList = ImmutableList.of(r1, r2);
Dataset<Row> data = sqlContext.createDataFrame(rowList, schemata);
+-----+------------+---------+
| NAME|STRING_VALUE|NUM_VALUE|
+-----+------------+---------+
|name1| value1| 1|
|name2| value2| 2|
+-----+------------+---------+
質問が正しく得られるかどうかはわかりませんが、RowFactoryを使用してJavaのArrayListから行を作成できます。
List<MyData> mlist = new ArrayList<MyData>();
mlist.add(d1);
mlist.add(d2);
Row row = RowFactory.create(mlist.toArray());
// DTOのリストを作成します
List<MyDTO> dtoList = Arrays.asList(.....));
// DTOのデータセットを作成します
Dataset<MyDTO> dtoSet = sparkSession.createDataset(dtoList,
Encoders.bean(MyDTO.class));
//行のデータセットが必要な場合
Dataset<Row> rowSet= dtoSet .select("col1","col2","col3");