PySpark字典转RDD方法及Spark 1.6.0下Word2Vec使用疑问
嘿,我看你正在用Spark 1.6.0版本的Word2Vec处理数据,先帮你确认下你的示例代码(顺便修正了import的小问题),再给你讲讲怎么把字典转成RDD~
一、Word2Vec 实践代码与结果
你参考官方文档写的代码逻辑没问题,这里修正了import语句的小疏漏,完整可运行代码如下:
from pyspark.mllib.feature import Word2Vec sentence = "a b " * 100 + "a c " * 10 localDoc = [sentence, sentence] doc = sc.parallelize(localDoc).map(lambda line: line.split(" ")) model = Word2Vec().setVectorSize(10).setSeed(42).fit(doc)
运行后得到的向量输出示例如下:
>>> model.getVectors() {'a': [0.26699373, -0.26908076, 0.0579859, -0.080141746, 0....
二、PySpark 中将字典转换为 RDD 的方法
针对你提到的字典转RDD需求,其实Spark的sc.parallelize()方法可以直接处理字典的可迭代对象,分几种常见场景:
1. 转换为键值对RDD(最常用)
如果你的字典是像model.getVectors()返回的单词-向量键值对结构,直接用字典的items()方法获取所有(key, value)元组,再并行化:
# 先拿到你的字典对象 word_vectors_dict = model.getVectors() # 转换为键值对RDD,每个元素是(单词, 向量)元组 word_vectors_rdd = sc.parallelize(word_vectors_dict.items())
这样得到的RDD可以直接用Spark的键值对算子(比如mapValues、reduceByKey)做后续处理。
2. 单独提取键或值的RDD
如果只需要字典里的键(比如所有单词)或者值(比如所有向量),可以分别用keys()和values()方法:
# 提取所有单词的RDD words_rdd = sc.parallelize(word_vectors_dict.keys()) # 提取所有向量的RDD vectors_rdd = sc.parallelize(word_vectors_dict.values())
需要注意的是,在Spark 1.6.0版本中,这些操作都是完全支持的,因为parallelize()可以接收任何Python可迭代对象,而字典的items()、keys()、values()都属于可迭代对象范畴。
内容的提问来源于stack exchange,提问作者Zhangrong.Huang
相关产品推荐
相关产品推荐

