pyspark用id分割文本

时间:2016-04-06 16:25:10

标签: python apache-spark split pyspark rdd

我有像这样的当前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(),那么代码是不行的吗?

1 个答案:

答案 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)