我有像这样的当前RDD数据
DataRDD = [(0,u'A chunk of text'),(1,u'Test sentence check')]
我的目标是将这些文本拆分为单词,同时保留这些句子的id
我的结果就像
[(0,u'A'),(0,u'chunk'),... ,(1,u'check')]
现在我正在尝试将flatmap与split()
一起使用result = DataRDD.flatmap(lambda (id,text):(id,text.split()))
但是如果我编写函数来直接拆分那些文本而不是split(),那么代码是不行的吗?
答案 0 :(得分:1)
不工作不是非常精确的描述,所以这里是一个问题清单:
DataRDD
不是RDD
。我认为它只是一个捷径,但始终欢迎提供MCVE。在命名约定时,请遵循PEP 8:
data_rdd = sc.parallelize([(0,u'A chunk of text'),(1,u'Test sentence check')])
没有RDD.flatmap
这样的方法。正确的方法是RDD.flatMap
:
data_rdd.flatMap(...)
在Python 3中删除了tuple参数解包。请参阅PEP 3113,以便遵循语法
lambda (id,text): ...
可能在您的平台上无效。如果你想让它便携,它应该是这样的:
lambda kv: (kv[0], kv[1].split())
flatMap
期望一个可迭代的结构。如果您使用上述功能,则只会展平tuple
。
data_rdd.flatMap(lambda kv: (kv[0], kv[1].split())).collect()
## [0, ['A', 'chunk', 'of', 'text'], 1, ['Test', 'sentence', 'check']]
为了使它工作,你应该构建一个像这样的迭代:
lambda kv: ((kv[0], v) for v in kv[1].split())
最后这样的任务非常普遍,有一个专用的flatMapValues
方法:
data_rdd.flatMapValues(str.split)