<jupyter_start><jupyter_text>Word Count```{note}Word Count 即读取一个文本文件，对文件中的单词做统计计数，然后打印出频次最高的几个单词。Word Count 是大数据的 Hello World。```  读取内容<jupyter_code>from pyspark import SparkContext

lineRDD = SparkContext().textFile("../data/wikiOfSpark.txt")<jupyter_output><empty_output><jupyter_text>SparkContext 是使用 spark 的开发入口之一，需要注意的是，Cannot run multiple SparkContexts at once。textFile 方法用于读取文本文件。lineRDD 的类型是 RDD[String]，可以暂时把它当成元素类型是 String 的数组，数组的每个元素都是文件中的一行字符串。  分词分词就是把“数组”的行元素打散为单词，要实现这一点，可以使用 RDD 的 flatMap 方法，先 map 再 flat，flat的示意图如下：![jupyter](../images/flat_map.webp)在分词之后，我们还希望过滤掉空字符串，可以使用 RDD 的 filter 方法实现。<jupyter_code># 分词
wordRDD = lineRDD.flatMap(lambda line: line.split(" "))
# 过滤
cleanWordRDD = wordRDD.filter(lambda word: word != "")<jupyter_output><empty_output><jupyter_text>分组计数在 RDD 的开发框架下，聚合类操作，如计数、求和、求均值，需要依赖键值对（Key Value Pair）类型的数据元素。<jupyter_code>kvRDD = cleanWordRDD.map(lambda word: (word, 1))<jupyter_output><empty_output><jupyter_text>使用聚合算子 reduceByKey 来完成分组计数：![jupyter](../images/reduce.webp)<jupyter_code># reduceByKey: 分组计数
wordCounts = kvRDD.reduceByKey(lambda x, y: x + y)
# sortBy: 排序
# take: 获取数个元素
print(wordCounts.sortBy(lambda x: x[1], False).take(5))<jupyter_output>[('the', 67), ('Spark', 63), ('a', 54), ('and', 51), ('of', 50)]
{'fraction_non_alphanumeric': 0.1500789889415482, 'fraction_numerical': 0.010268562401263823, 'mean_word_length': 9.385245901639344, 'pattern_counts': {'":': 0, '<': 16, '<?xml version=': 0, '>': 16, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '173926', 'license': 'MIT', 'n_tokens_mistral': 677, 'n_tokens_neox': 694, 'n_words': 85, 'path': 'rdd/1.word count.ipynb', 'repo_name': 'newfacade/notes-on-spark', 'size': '1266'}