java - 将 spark word2vec vector 转储到文件中

标签 java apache-spark rdd apache-spark-mllib word2vec

我正在使用 spark mllib 生成词 vector 。我希望拟合我所有的数据,然后获取经过训练的词 vector 并将它们转储到一个文件中。

我正在这样做:

JavaRDD<List<String>> data = javaSparkContext.parallelize(streamingData, partitions);
Word2Vec word2vec = new Word2Vec();
Word2VecModel model = word2vec.fit(data);

所以,如果我的训练数据有这样的句子

I love Spark

我想将文件中的输出保存为:

I       0.03 0.53 0.12...
love    0.31 0.14 0.12...
Spark   0.41 0.18 0.84...

训练后,我像这样从模型对象中获取 vector

Map<String, float[]> wordMap = JavaConverters.mapAsJavaMapConverter(model.getVectors()).asJava();
List<String> wordvectorlist = Lists.newArrayList();
for (String s : wordMap.keySet()) {
    StringBuilder wordvector = new StringBuilder(s);
    for (float f : wordMap.get(s)) {
        wordvector.append(" " + f);
    }
    wordvectorlist.add(wordvector.toString());
    if (wordvectorlist.size() > 1000000) {
        writeToFile(wordvectorlist);
        wordvectorlist.clear();
    }

}

我将为非常大的数据(~1.5 TB)生成这些词 vector ,因此,我可能无法将返回的对象 Word2VecModel 保存在我的驱动程序的内存中。 我如何将这个词 vector 映射存储为 rdd,以便我可以写入文件而不将完整映射存储在驱动程序内存中?

我研究了 deeplearning4j 的 word2vec 实现,但该实现还需要将所有 vector 加载到驱动程序内存中。

最佳答案

Word2VecModel 有一个 save以自己的格式将其保存到磁盘的功能 这将创建一个名为 data 的目录,其中包含数据的 parquet 文件和一个包含人类可读元数据的元数据文件。

您现在可以读取 parquet 文件并自行转换,或者执行 spark.read.parquet 将其读取到数据帧。每行将包含一些 map ,您可以按照自己的意愿编写。

关于java - 将 spark word2vec vector 转储到文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40991973/

相关文章:

apache-spark - 当文件无法容纳在Spark的主内存中时,Spark如何读取大文件(PB)

apache-spark - 如何确保从 Parquet 加载 Spark DataFrame 是分布式和并行的?

scala - 分解具有不同长度的相同类型的多个列

apache-spark - pyspark 将数据添加到 TempTable

java - Hibernate 过滤器的 JPA 等效项

python - 获取 Spark RDD 中每个键的最大值

java - Spark 将 JavaPairDStream 流式传输到文本文件

java - 如何使用JPA从自引用实体中的某个级别选择子实体?

java - 展开时折叠所有其他 Recyclerview 项目

java - 使用集合的排序方法对 JList 进行排序