### PySpark 综合案例笔记
#### 环境配置
1. **Python环境**:指定Python解释器路径。
```python
os.environ['PYSPARK_PYTHON'] = '/export/server/anaconda3/bin/python'
```
2. **Hadoop环境**:指定Hadoop安装路径。
```python
os.environ['HADOOP_HOME'] = "/export/server/hadoop-3.3.1"
```
#### SparkContext 初始化
1. **配置SparkConf**:
- 设置应用名称。
- 设置默认并行度为24,适合集群模式。
```python
conf = SparkConf().setAppName("spark_cluster")
conf.set("spark.default.parallelism", "24")
```
2. **创建SparkContext**:
```python
sc = SparkContext(conf=conf)
```
#### 需求实现
##### 需求1:热门搜索时间段Top3(小时精度)
1. **读取文件**:将文件内容读取为RDD。
```python
file_rdd = sc.textFile("hdfs://m1:8020/data/search_log.txt")
```
2. **处理数据**:
- 取出时间并转换为小时。
- 转换为(小时, 1)的二元组。
- Key分组聚合Value。
- 排序(降序)。
- 取前3。
```python
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. **处理数据**:
- 取出搜索词。
- 转换为(词, 1)的二元组。
- 分组聚合。
- 排序。
- Top3。
```python
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. **处理数据**:
- 过滤内容,只保留“黑马程序员”关键词。
- 转换为(小时, 1)的二元组。
- Key分组聚合Value。
- 排序(降序)。
- 取前1。
```python
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格式,写出到文件中
1. **转换为JSON格式的RDD**:
- 将每行数据转换为字典格式。
- 转换为JSON字符串。
```python
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的基本操作和数据处理流程,为更复杂的大数据处理任务打下基础。