Как создать карту dataFrame из другого dataFrame в Java? - PullRequest
0 голосов
/ 20 марта 2019

У меня есть датафрейм, подобный следующему:

+-----------------+--------------------+
|               id|            document|
+-----------------+--------------------+
| doc1            |"word1, word2"      |
| doc2            |"word3 word4"       |
+-----------------+--------------------+

Я хочу создать еще один фрейм данных со следующей структурой:

   +-----------------+--------------------+-----------------+
    |               id|            document| word           |
    +-----------------+--------------------+----------------|
    | doc1            |"word1, word2"      | word1          |
    | doc1            |"word1 word2"       | word2          |
    | doc2            |"word3 word4"       | word3          |
    | doc2            |"word3 word4"       | word4          |
    +-----------------+--------------------+----------------|

Я пробовал следующее:

public static Dataset<Row> buildInvertIndex(Dataset<Row> inputRaw, SQLContext sqlContext, String id) {

    JavaRDD<Row> inputInvertedIndex = inputRaw.javaRDD();
    JavaRDD<Tuple3<String, String ,String>> d = inputInvertedIndex.flatMap(x -> {

        List<Tuple3<String, String, String>> k = new ArrayList<>();
        String data2 = x.getString(0).toString();
        String[] field2 = x.getString(1).split(" ", -1);
        for(String s: field2)
            k.add(new Tuple3<String, String, String>(data2, x.getString(1), s));
        return k.iterator();
    }
            );


    JavaPairRDD<String, Tuple2<String, String>>d2 = d.mapToPair(x->{
        return new Tuple2<String, Tuple2<String, String>>(x._3(), new Tuple2<String, String>(x._1(), x._2()));  

    });

    Dataset<Row> d3 = sqlContext.createDataset(JavaPairRDD.toRDD(d2), Encoders.tuple(Encoders.STRING(), Encoders.tuple(Encoders.STRING(),Encoders.STRING()))).toDF();

    return d3;
}

Но это дает:

+-----------------+----------------------+
|               _1|            _2        |
+-----------------+----------------------+
| word1           |[doc1,"word1, word2"] |
| word2           |[doc1,"word1 word2"]  |
| word3           |[doc2, "word3, word4"]|
| word4           |[doc2, "word3, word4"]|
+-----------------+----------------------+

Я новичок, чтобы зажечь в Java.ТАК пожалуйста, любая помощь будет так ценится.Кроме того, предположим, что во втором приведенном выше кадре данных я хочу вычислить метрику сходства строк (например, jaccard) для документа и слова с двумя столбцами и добавить результат в новый столбец, как я могу это сделать?

1 Ответ

1 голос
/ 20 марта 2019

Вы можете использовать взрыв и split

import static org.apache.spark.sql.functions.expr;
inputRaw.withColumn("word", expr("explode(split(document, '[, ]+'))"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...