环境配置
- Python环境:指定Python解释器路径。
os.environ['PYSPARK_PYTHON'] = '/export/server/anaconda3/bin/python'
- Hadoop环境:指定Hadoop安装路径。
os.environ['HADOOP_HOME'] = "/export/server/hadoop-3.3.1"
SparkContext 初始化
- 配置SparkConf:
- 设置应用名称。
- 设置默认并行度为24,适合集群模式。
conf = SparkConf().setAppName("spark_cluster") conf.set("spark.default.parallelism", "24")
- 创建SparkContext:
sc = SparkContext(conf=conf)
需求实现
需求1:热门搜索时间段Top3(小时精度)
- 读取文件:将文件内容读取为RDD。
file_rdd = sc.textFile("hdfs://m1:8020/data/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("hdfs://m1:8020/output/output_json")
总结
- 数据读取:使用
textFile
方法读取HDFS上的文本文件。 - 数据处理:通过
map
、filter
、reduceByKey
、sortBy
等方法进行数据转换和聚合。 - 结果输出:使用
take
方法获取结果,使用saveAsTextFile
方法将结果写入HDFS上的文件。 - 注意事项:
- 在集群模式下,设置合适的并行度可以提高数据处理效率。
- 使用
numPartitions=1
确保数据在单个分区中进行排序和聚合,避免数据在多个分区中分布导致的不一致性。 - 将数据转换为JSON格式时,确保每个字段都正确映射到字典中。
通过这个案例,可以深入理解PySpark的基本操作和数据处理流程,为更复杂的大数据处理任务打下基础。