1127头歌作业

第一关第一题

任务描述

本关任务:根据编程要求,完成任务。

编程要求

打开右侧代码文件窗口,在 BeginEnd 区域补充代码,完成任务。

读取 /data/bigfiles/employee.json 文件,并填充 Python 语句完成右侧代码文件中列出的所有操作。

文件内容如下:

{ "id":1 ,"name":" Ella","age":36 }
{ "id":2,"name":"Bob","age":29 }
{ "id":3 ,"name":"Jack","age":29 }
{ "id":4 ,"name":"Jim","age":28 }
{ "id":5 ,"name":"Damon" }
{ "id":5 ,"name":"Damon" }

测试说明

平台将对你编写的代码进行评测,如果与预期结果一致,则通关,否则测试失败。

import findspark
findspark.init()
from pyspark.sql import SparkSession

################ Begin ################

# 创建SparkSession对象
sc = SparkSession.builder.master("local[*]").appName('read').getOrCreate()

# 读取文件
df = sc.read.json("file:///data/bigfiles/employee.json")

# 查询DataFrame的所有数据
df.show()

# 查询所有数据,并去除重复的数据
df.distinct().show()

# 查询所有数据,打印时去除id字段
df.drop("id").show()

# 筛选age>20的记录
df.filter(df.age > 20).show()

# 将数据按name分组
df.groupBy("name").count().show()

# 将数据按name升序排列
df.sort(df.name.asc()).show()

# 取出前3行数据
df.take(3)

# 查询所有记录的name列,并为其取别名为username
df.select(df.name.alias("username")).show()

# 查询年龄age的平均值
df.agg({"age": "mean"}).show()

# 查询年龄age的最大值
df.agg({"age": "max"}).show()

# 关闭SparkSession对象
sc.stop()

################ End ################

第二题

任务描述

本关任务:根据编程要求,完成任务。

编程要求

打开右侧代码文件窗口,在 BeginEnd 区域补充代码,完成任务。

读取 /data/bigfiles/employee.txt 文件,实现从 RDD 转换得到 DataFrame,打印出所有数据。

文件内容如下:

1,Ella,362,Bob,293,Jack,29

输出结果如下:

+---+----+---+              
| id|name|age|
+---+----+---+
|  1|Ella| 36||  2| Bob| 29||  3|Jack| 29
|+---+----+---+

测试说明

平台将对你编写的代码进行评测,如果与预期结果一致,则通关,否则测试失败。

import findspark
findspark.init()
from pyspark.sql import SparkSession
from pyspark.sql.types import Row

################ Begin ################

# 创建SparkSession对象
spark = SparkSession.builder.appName("example").getOrCreate()

# 创建SparkContext对象
sc = spark.sparkContext

# 读取文本文件
lines = sc.textFile("/data/bigfiles/employee.txt")

# 将 RDD 转换为 DataFrame
data = lines.map(lambda x: x.split(",")).map(lambda x: Row(id=int(x[0]), name=x[1], age=int(x[2])))
df = spark.createDataFrame(data)

# 创建临时视图
df.createOrReplaceTempView("employee")

# 执行SQL查询并打印结果
result = spark.sql("SELECT * FROM employee")
result.show()

# 关闭SparkSession对象
spark.stop()

################ End ################

第三题

任务描述

本关任务:根据编程要求,完成任务。

编程要求

打开右侧代码文件窗口,在 BeginEnd 区域补充代码,完成任务。

读取 MySQL 数据库 sparktest 中的 employee 数据,该表共有四个字段,分别为:idnamegenderage

将下列数据插入到该表中:

id,name,gender,age3,Mary,F,264,Tom,M,23

然后计算并打印出 age 字段的最大值和 age 字段的总和。

MySQL 数据库连接信息

账号: root 密码:123123 地址:127.0.0.1 端口:3306

输出结果如下:

+--------+
|max(age)
|+--------+
|      26|
+--------++--------+
|sum(age)|
+--------+
|      96|
+--------+

测试说明

平台将对你编写的代码进行评测,如果与预期结果一致,则通关,否则测试失败。

import findspark
findspark.init()
from pyspark import SparkContext
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StructField, StringType, IntegerType, Row

################ Begin ################

# 创建SparkContext对象
sc = SparkContext(appName="jdbc test")
spark = SparkSession(sc)

# 读取 MySQL 数据
jdbcDF = spark.read.format("jdbc") \
    .option("url", "jdbc:mysql://localhost:3306/sparktest") \
    .option("driver", "com.mysql.jdbc.Driver") \
    .option("dbtable", "employee") \
    .option("user", "root") \
    .option("password", "123123") \
    .load()

# 插入数据
studentRDD = sc.parallelize(["3 Mary F 26", "4 Tom M 23"]).map(lambda line: line.split(" "))
schema = StructType([StructField("id", IntegerType(), True),
                     StructField("name", StringType(), True),
                     StructField("gender", StringType(), True),
                     StructField("age", IntegerType(), True)])

rowRDD = studentRDD.map(lambda p: Row(int(p[0]), p[1].strip(), p[2].strip(), int(p[3])))
employeeDF = spark.createDataFrame(rowRDD, schema)

prop = {
    'user': 'root',
    'password': '123123',
    'driver': 'com.mysql.jdbc.Driver'
}

employeeDF.write.jdbc("jdbc:mysql://localhost:3306/sparktest", 'employee', 'append', prop)

# 计算 age 字段最大值和总和,输出结果
jdbcDF.collect()
jdbcDF.agg({"age": "max"}).show()
jdbcDF.agg({"age": "sum"}).show()

# 关闭SparkContext对象
sc.stop()

################ End ################

多去去实验室吧,就三四个人