Spark RDD映射问题:如何生成单词与对应行号的关联表
问题
我的RDD数据格式如下:
['101 We no longer have to go to a store during limited hours , stalk the aisles looking for a product , and then wait in check-out lines','102 Now with the click of a button, we have the freedom to shop for anything , anywhere , and at any time . ','103 Every day is Christmas if you buy yourself stuff online .']
我希望生成关联表,键为字符串中的每个单词,值为对应字符串的编号(如101、102),最终得到类似[(We,101),(no,101),...,(Now,102),...]的结果。
我尝试了以下代码:
associateRDD = rdd.map(lambda line:(line.split(" "),line.split(" ")[0]))
得到的结果是[(['We','no',...],'101'),(['Now',...],'102'),...],不知道如何拆分列表生成每个单词对应编号的元组,请求帮助。
解决方案
直接用flatMap替代你代码里的map就行——map是每条输入对应一个输出,而flatMap能把一条输入拆成多个输出并展开成单个元素的RDD。具体代码如下:
associateRDD = rdd.flatMap(lambda line: [(word, line.split(" ")[0]) for word in line.split(" ")[1:]])
代码逻辑:
- 先通过
line.split(" ")[0]提取当前行的编号(比如101、102) - 用
line.split(" ")[1:]拿到这一行里除了编号以外的所有单词 - 用列表推导式把每个单词和编号拼成元组,再靠
flatMap把这些元组逐个展开成RDD的元素
这样跑出来的结果就是你要的[(We,101),(no,101),...,(Now,102),...]格式了。
内容的提问来源于stack exchange,提问作者anny777
相关产品推荐
相关产品推荐

