Отображение из строки в список <String>в наборе данных - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь отобразить от 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);
    }
}

Конечно, это всего лишь взлом.Я не буду представлять это как ответ, так как надеюсь, что кто-то может найти элегантное решение этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...