【问题标题】:Spark - Word count testSpark - 字数测试
【发布时间】:2015-01-16 02:57:11
【问题描述】:

我只想计算 spark (pyspark) 中的单词,但我可以映射字母或整个字符串。

我试过了: (整串)

v1='Hi hi hi bye bye bye word count' 
v1_temp=sc.parallelize([v1]) 
v1_map = v1_temp.flatMap(lambda x: x.split('\t'))
v1_counts = v1_map.map(lambda x: (x, 1))
v1_counts.collect()  

或(只是字母)

v1='Hi hi hi bye bye bye word count'
v1_temp=sc.parallelize(v1)
v1_map = v1_temp.flatMap(lambda x: x.split('\t'))
v1_counts = v1_map.map(lambda x: (x, 1))
v1_counts.collect()

【问题讨论】:

  • 好吧,这里的问题与 Spark 无关,您尝试按制表符拆分:split('\t'),而您需要的是简单地调用 split()

标签: python count mapreduce apache-spark pyspark


【解决方案1】:

当您执行sc.parallelize(sequence) 时,您正在创建一个将并行操作的 RDD。在第一种情况下,您的序列是一个包含单个元素(整个句子)的列表。在第二种情况下,您的序列是一个字符串,在 python 中类似于字符列表。

如果你想并行计算单词,你可以这样做:

from operator import add

s = 'Hi hi hi bye bye bye word count' 
seq = s.split()   # ['Hi', 'hi', 'hi', 'bye', 'bye', 'bye', 'word', 'count']
sc.parallelize(seq)\
  .map(lambda word: (word, 1))\
  .reduceByKey(add)\
  .collect()

会得到你:

[('count', 1), ('word', 1), ('bye', 3), ('hi', 2), ('Hi', 1)]

【讨论】:

    【解决方案2】:

    如果您只想计算字母数字单词,这可能是一个解决方案:

    import time, re
    from pyspark import SparkContext, SparkConf
    
    def linesToWordsFunc(line):
        wordsList = line.split()
        wordsList = [re.sub(r'\W+', '', word) for word in wordsList]
        filtered = filter(lambda word: re.match(r'\w+', word), wordsList)
        return filtered
    
    def wordsToPairsFunc(word):
        return (word, 1)
    
    def reduceToCount(a, b):
        return (a + b)
    
    def main():
        conf = SparkConf().setAppName("Words count").setMaster("local")
        sc = SparkContext(conf=conf)
        rdd = sc.textFile("your_file.txt")
    
        words = rdd.flatMap(linesToWordsFunc)
        pairs = words.map(wordsToPairsFunc)
        counts = pairs.reduceByKey(reduceToCount)
    
        # Get the first top 100 words
        output = counts.takeOrdered(100, lambda (k, v): -v)
    
        for(word, count) in output:
            print word + ': ' + str(count)
    
        sc.stop()
    
    if __name__ == "__main__":
        main()
    

    【讨论】:

      【解决方案3】:

      网上的wordcount有很多版本,以下是其中的一个;

      #to count the words in a file hdfs:/// of file:/// or localfile "./samplefile.txt"
      rdd=sc.textFile(filename)
      
      #or you can initialize with your list
      v1='Hi hi hi bye bye bye word count' 
      rdd=sc.parallelize([v1])
      
      
      wordcounts=rdd.flatMap(lambda l: l.split(' ')) \
              .map(lambda w:(w,1)) \
              .reduceByKey(lambda a,b:a+b) \
              .map(lambda (a,b):(b,a)) \
              .sortByKey(ascending=False)
      
      output = wordcounts.collect()
      
      for (count,word) in output:
          print("%s: %i" % (word,count))
      

      【讨论】:

        猜你喜欢
        • 2018-07-08
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-25
        相关资源
        最近更新 更多