Spark SQL 给定JSON文件`student.json`内容如下: (将下列数据复制到student.json中,并上传到liunx操作系统/home/hadoop目录下) ` ``json {"id":1, "name":"Alice", "score":85} {"id":2, "name":"Bob", "score":92} {"id":3, "name":"Charlie", "score":78} {"id":4, "name":"alex", "score":59} {"id":5, "name":"tom", "score":88} {"id":6, "name":"jack", "score":91} ``` **要求**: 1. 读取JSON文件创建DataFrame,并打印Schema。 2. 使用DataFrame API查询分数大于80的学生姓名和分数。 3. 注册临时表,通过Spark SQL实现成绩排名前3的学生记录。 4. 将要求3结果保存为Parquet格式文件
时间: 2025-05-29 16:58:03 浏览: 28
### 使用 Spark SQL 处理 JSON 文件的任务
以下是基于 Spark SQL 的解决方案,涵盖了从读取 `student.json` 到保存结果为 Parquet 格式的全过程。
#### 1. 创建 DataFrame 并打印 Schema
要读取 JSON 文件并将其转换为 DataFrame,可以使用 `spark.read.json()` 方法。之后调用 `.printSchema()` 打印数据结构。
```python
from pyspark.sql import SparkSession
# 初始化 SparkSession
spark = SparkSession.builder.appName("ProcessStudentData").getOrCreate()
# 读取 JSON 文件并创建 DataFrame
df = spark.read.json("student.json")
# 打印 Schema
df.printSchema()
```
此部分操作会加载 JSON 数据到内存中,并展示其字段定义[^1]。
---
#### 2. 查询分数大于 80 的学生姓名和分数
可以通过过滤条件筛选出符合条件的数据,并仅保留所需的列。
```python
# 过滤分数大于 80 的记录,并选择 name 和 score 字段
filtered_df = df.filter(df["score"] > 80).select("name", "score")
# 显示结果
filtered_df.show()
```
这里利用了 Spark SQL 提供的表达式语法来执行过滤和投影操作[^2]。
---
#### 3. 注册临时表并通过 SQL 查询成绩排名前 3 的学生记录
为了通过 SQL 实现复杂查询,需先注册 DataFrame 为临时视图,再编写相应的 SQL 表达式。
```python
# 注册临时表
df.createOrReplaceTempView("students")
# 编写 SQL 查询以获取成绩排名前三的学生
top_3_query = """
SELECT *
FROM students
ORDER BY score DESC
LIMIT 3
"""
# 执行 SQL 查询并将结果存储到新的 DataFrame 中
top_3_students = spark.sql(top_3_query)
# 展示结果
top_3_students.show()
```
这段代码展示了如何结合 SQL 语句实现排序与限制功能[^3]。
---
#### 4. 将结果保存为 Parquet 格式文件
最后一步是将处理后的数据导出至指定路径下的 Parquet 文件。
```python
# 将 top_3_students 结果保存为 Parquet 文件
output_path = "/path/to/output/parquet"
top_3_students.write.parquet(output_path, mode="overwrite")
```
此处指定了输出模式为覆盖现有文件的方式[^4]。
---
### 总结
以上步骤依次完成了 DataFrame 构建、高级查询以及最终的结果持久化工作流设计。
阅读全文
相关推荐











