Я пытаюсь отобразить от String
до List<String>
.Как мне придумать Encoder<List<String>>
?
Row data = RowFactory.create("123");
StructType schema = new StructType(new StructField[]{
new StructField("text", DataTypes.StringType, false, Metadata.empty())
});
Dataset<Row> df = spark.createDataFrame(data, schema)
.map(s -> Arrays.<String>asList(s), <b>???</b>);
Я получил это далеко:
Я сам нашел два ответа.В обоих случаях вы будете использовать Encoders.bean()
статический метод.Но что касается первого решения, вы можете просто передать его List.class
:
Row data = RowFactory.create("123");
StructType schema = new StructType(new StructField[]{
new StructField("text", DataTypes.StringType, false, Metadata.empty())
});
Dataset<Row> df = spark.createDataFrame(data, schema)
.map(s -> Arrays.<String>asList(s), Encoders.bean(List.class));
Во втором решении (более конкретном, но немного некрасивом):
Row data = RowFactory.create("123");
StructType schema = new StructType(new StructField[]{
new StructField("text", DataTypes.StringType, false, Metadata.empty())
});
Dataset<Row> df = spark.createDataFrame(data, schema)
.map(s -> Arrays.<String>asList(s), Encoders.bean((Class<List<String>>) Collections.<String>emptyList().getClass()));
Покаоба эти решения компилируются, но оба они сталкиваются с ошибкой во время выполнения:
Exception in thread "main" java.lang.AssertionError: assertion failed
И это относится к строке .map()
.
Единственный способ, который я нашел для решения проблемы, этоэто:
Row data = RowFactory.create("123");
StructType schema = new StructType(new StructField[]{
new StructField("text", DataTypes.StringType, false, Metadata.empty())
});
Dataset<Row> df = spark.createDataFrame(data, schema)
.map(s -> new DummyList(s), Encoders.bean(DummyList.class));
В то время как DummyList
это:
class DummyList implements Serializable
{
public ArrayList<String> list = new ArrayList<>();
public DummyList(String s) {
list.add(s);
}
}
Конечно, это всего лишь взлом.Я не буду представлять это как ответ, так как надеюсь, что кто-то может найти элегантное решение этой проблемы.