【问题标题】:pyspark split text with idpyspark 用 id 分割文本
【发布时间】:2016-04-06 16:25:10
【问题描述】:

我有一个这样的当前 RDD 数据

DataRDD =    [(0,u'A chunk of text'),(1,u'Test sentence check')]

我的目标是需要将这些文本拆分成单词,同时保留这些句子的 id

我的结果会是这样的

[(0,u'A'),(0,u'chunk'),... ,(1,u'check')]

现在我正在尝试使用带有 split() 的 flatmap

result = DataRDD.flatmap(lambda (id,text):(id,text.split()))

但是代码不起作用,我应该编写函数来拆分这些文本而不是直接使用 split() 吗?

【问题讨论】:

    标签: python apache-spark split pyspark rdd


    【解决方案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 中删除。请参阅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)
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 2013-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-27
      相关资源
      最近更新 更多