1.环境配置
- Python环境:指定Python解释器路径。
os.environ['PYSPARK_PYTHON'] = 'D:/dev/python/python310/python.exe'
- Hadoop环境:指定Hadoop安装路径。
os.environ['HADOOP_HOME'] = "D:/dev/hadoop-3.0.0"
2.SparkContext 初始化
- 配置SparkConf:
- 设置Master为本地模式,使用所有可用的CPU核心。
- 设置应用名称。
- 设置默认并行度。
conf = SparkConf().setMaster("local[*]").setAppName("test_spark") conf.set("spark.default.parallelism", "1")
- 创建SparkContext:
sc = SparkContext(conf=conf)
3.需求实现
需求1:热门搜索时间段Top3(小时精度)
- 读取文件:将文件内容读取为RDD。
file_rdd = sc.textFile("D:/search_log.txt")
- 处理数据:
- 取出时间并转换为小时。
- 转换为(小时, 1)的二元组。
- Key分组聚合Value。
- 排序(降序)。
- 取前3。
result1 = file_rdd.map(lambda x: (x.split("\t")[0][:2], 1)).\ reduceByKey(lambda a, b: a + b).\ sortBy(lambda x: x[1], ascending=False, numPartitions=1).\ take(3) print("需求1的结果:", result1)
需求2:热门搜索词Top3
- 处理数据:
- 取出搜索词。
- 转换为(词, 1)的二元组。
- 分组聚合。
- 排序。
- Top3。
result2 = file_rdd.map(lambda x: (x.split("\t")[2], 1)).\ reduceByKey(lambda a, b: a + b).\ sortBy(lambda x: x[1], ascending=False, numPartitions=1).\ take(3) print("需求2的结果:", result2)
需求3:统计“黑马程序员”关键字在什么时段被搜索的最多
- 处理数据:
- 过滤内容,只保留“黑马程序员”关键词。
- 转换为(小时, 1)的二元组。
- Key分组聚合Value。
- 排序(降序)。
- 取前1。
result3 = file_rdd.map(lambda x: x.split("\t")).\ filter(lambda x: x[2] == '黑马程序员').\ map(lambda x: (x[0][:2], 1)).\ reduceByKey(lambda a, b: a + b).\ sortBy(lambda x: x[1], ascending=False, numPartitions=1).\ take(1) print("需求3的结果:", result3)
需求4:将数据转换为JSON格式,写出到文件中
- 转换为JSON格式的RDD:
- 将每行数据转换为字典格式。
- 转换为JSON字符串。
file_rdd.map(lambda x: x.split("\t")).\ map(lambda x: {"time": x[0], "user_id": x[1], "key_word": x[2], "rank1": x[3], "rank2": x[4], "url": x[5]}).\ saveAsTextFile("D:/output_json")
4.总结
- 数据读取:使用
textFile
方法读取文本文件。 - 数据处理:通过
map
、filter
、reduceByKey
、sortBy
等方法进行数据转换和聚合。 - 结果输出:使用
take
方法获取结果,使用saveAsTextFile
方法将结果写入文件。 - 注意事项:在本地模式下,
numPartitions=1
确保数据在单个分区中进行排序和聚合,避免数据在多个分区中分布导致的不一致性。
通过这个案例,可以深入理解PySpark的基本操作和数据处理流程,为更复杂的大数据处理任务打下基础。