实验三 Spark SQL基础编程

实验三 Spark SQL基础编程

1.实验目的

1. 掌握 Spark SQL 的基本编程方法;

2. 熟悉 RDD 到 DataFrame 的转化方法;

3. 熟悉利用 Spark SQL 管理来自不同数据源的数据。

2.实验内容

1.Spark SQL 基本操作 将下列 JSON 格式数据复制到 Linux 系统中,并保存命名为 employee.json。

{ "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":4, "name":"Jim", "age":28 }

{ "id":5, "name":"Damon" }

{ "id":5, "name":"Damon" }

为 employee.json 创建 DataFrame,并写出 Python 语句完成下列操作:

(1)查询所有数据;

(2)查询所有数据,并去除重复的数据;

(3)查询所有数据,打印时去除 id 字段;

(4)筛选出 age>30 的记录;

(5)将数据按 age 分组;

(6)将数据按 name 升序排列;

(7)取出前 3 行数据;

(8)查询所有记录的 name 列,并为其取别名为 username;

(9)查询年龄 age 的平均值;

(10)查询年龄 age 的最小值。

创建json文件

echo '{ "id":1, "name":"Ella", "age":36 }' > employee.json
echo '{ "id":2, "name":"Bob", "age":29 }' >> employee.json
echo '{ "id":3, "name":"Jack", "age":29 }' >> employee.json
echo '{ "id":4, "name":"Jim", "age":28 }' >> employee.json
echo '{ "id":4, "name":"Jim", "age":28 }' >> employee.json
echo '{ "id":5, "name":"Damon" }' >> employee.json
echo '{ "id":5, "name":"Damon" }' >> employee.json

参考代码:关键代码如下。

#导入
....
//创建sprak对象
....

df = spark.read.json("employee.json")


df.show()


df_distinct = df.distinct()
df_distinct.show()


df_without_id = df.select("name", "age")
df_without_id.show()

df_age_gt_30 = df.filter(col("age") > 30)
df_age_gt_30.show()

df_grouped_by_age = df.groupBy("age").count()
df_grouped_by_age.show()

df_sorted_by_name = df.orderBy("name")
df_sorted_by_name.show()
df_top_3 = df.limit(3)
df_top_3.show()

df_with_username = df.select(col("name").alias("username"))
df_with_username.show()


print(df.select(avg("age")).first()[0])


print(df.select(min("age")).first()[-3] )

//关闭
...

 

2.编程实现将 RDD 转换为 DataFrame 源文件内容如下(包含 id,name,age):

1,Ella,36

2,Bob,29

3,Jack,29

请将数据复制保存到 Linux 系统中,命名为 employee.txt,实现从 RDD 转换得到 DataFrame,并按“id:1,name:Ella,age:36”的格式打印出 DataFrame 的所有数据。

请写出 程序代码。

关键代码如下:

# 创建SparkSession
.......

# 定义源文件的结构类型

.......
# 读取源文件并创建RDD
....

# 将RDD转换为DataFrame
df = spark.createDataFrame(rdd, schema)

# 打印DataFrame的所有数据
df.show(truncate=False)

# 将DataFrame的数据按指定格式打印出来
df_string = df.rdd \
    .map(lambda row: f"id:{row['id']},name:{row['name']},age:{row['age']}") \
    .collect()

for data in df_string:
    print(data)

.......

 

 

3. 编程实现利用 DataFrame 读写 MySQL 

(1)在 MySQL 数据库中新建数据库 sparktest,再创建表 employee,包含如表 1 所示 的两行数据

表 1 employee

 

(2)配置 Spark 通过 JDBC 连接数据库 MySQL,编程实现利用 DataFrame 插入如表 2 所 示的两行数据到 MySQL 中,最后打印出 age 的最大值和 age 的总和。

表 2 employee

sql语句:

CREATE DATABASE sparktest;

USE sparktest;

CREATE TABLE employee (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  gender CHAR(1),
  age INT
);

INSERT INTO employee (id, name, gender, age) VALUES
(1, 'Alice', 'F', 22),
(2, 'John', 'M', 25);

 python代码

from pyspark.sql import SparkSession

# 创建SparkSession
spark = SparkSession.builder \
    .appName("MySQL Example") \
    .getOrCreate()

# 定义MySQL连接信息
mysql_host = "localhost"
mysql_port = "3306"
mysql_database = "sparktest"
mysql_table = "employee"
mysql_username = "root"

mysql_password = "root"

# 创建DataFrame
data = [("3", "Mary", "F", 26), ("4", "Tom", "M", 23)]
columns = ["id", "name", "gender", "age"]
df = spark.createDataFrame(data, columns)

# 写入MySQL数据库
df.write.format("jdbc") \
    .option("url", f"jdbc:mysql://{mysql_host}:{mysql_port}/{mysql_database}&useSSL=false") \
    .option("dbtable", mysql_table) \
    .option("user", mysql_username) \
    .option("password", mysql_password) \
    .mode("append") \
    .save()

# 从MySQL数据库读取数据
df_mysql = spark.read.format("jdbc") \
    .option("url", f"jdbc:mysql://{mysql_host}:{mysql_port}/{mysql_database}") \
    .option("dbtable", mysql_table) \
    .option("user", mysql_username) \
    .option("password", mysql_password) \
    .load()

# 计算age的最大值和总和
max_age = df_mysql.selectExpr("max(age)").collect()[0][0]
sum_age = df_mysql.selectExpr("sum(age)").collect()[0][0]

# 打印结果
print("Max Age:", max_age)
print("Sum of Age:", sum_age)

# 关闭SparkSession
spark.stop()

 

 3.参考代码

https://download.csdn.net/download/weixin_41957626/87780630

 

 

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 实验5是关于Spark SQL编程初级实践的实验。在这个实验,学习者将学习如何使用Spark SQL进行数据分析和处理。具体来说,学习者将学习如何使用Spark SQL进行数据的读取、转换、过滤和聚合等操作,以及如何使用Spark SQL进行数据可视化和报表生成等操作。此外,学习者还将学习如何使用Spark SQL进行数据的存储和管理,以及如何使用Spark SQL进行数据的优化和性能调优等操作。通过这个实验,学习者将掌握Spark SQL编程的基本技能,为进一步深入学习和应用Spark SQL打下坚实的基础。 ### 回答2: 实验5是一项关于Spark SQL编程的初级实践,主要涉及到Spark SQL数据处理、聚合和分析操作。在这个实践,我们使用了一些简单的Spark SQL语句,通过对一个示例数据集的分析和处理,来深入了解Spark SQL的基本操作和使用方法。 首先,我们通过读取示例数据的CSV文件,将数据加载到Spark SQL,并将其注册为一个表。在这个步骤,我们学习了如何使用Spark SQL数据读取器和数据格式化器,以及如何将数据转换为表格结构。接着,我们使用了一些简单的查询语句,来了解如何对数据进行筛选、排序和过滤操作。这些查询语句包括SELECT、WHERE、ORDER BY、LIMIT等命令,可以轻松地对数据进行简单的分析和处理。 接下来,我们使用了一些聚合和分析操作,对数据进行了更加深入的处理。在这个步骤,我们学习了如何使用GROUP BY命令,对数据进行分组聚合,以及如何使用SUM、COUNT、AVG等函数,对数据进行计算和统计操作。通过这些操作,我们可以更加直观地了解数据的特征和规律,并得出一些有用的结论和建议。 最后,我们使用了一些高级的Spark SQL语句,对数据进行了更加复杂的处理和分析操作。例如,我们使用了JOIN命令,将多个数据表进行关联,并使用HAVING命令,对关联后的数据进行筛选和分析。这些高级操作可以更加深入地挖掘数据的潜在价值和意义,为后续的数据分析和挖掘工作奠定了基础。 总的来说,实验5是一项非常有意义的初级实践,通过对Spark SQL的基本操作和使用方法的学习和实践,帮助我们更好地理解和掌握了这一强大的数据处理工具。在今后的数据分析和挖掘工作,这些知识和技能将会派上大用场,成为我们掌握和应用大数据技术的重要基础。 ### 回答3: Spark SQLSpark 一个用于结构化数据处理的用例,提供了一种对结构化数据进行操作的 API。同时,Spark SQL 还支持许多 SQL 查询和类似数据操作的API,例如 DataFrame,DataSet 和 SQL 语言。 在本次实验,我们学习了如何使用 Spark SQL数据进行操作。首先,我们需要将数据导入到 Spark 。我们可以使用 Spark 的 read 方法,从 CSV 文件、JSON 文件或 HDFS 文件系统读取数据。将数据读入Spark DataFrame 后,我们可以使用 Spark SQL API 对数据进行过滤、聚合、分组等操作。 在这次实验,我们通过读取 CSV 文件并创建 DataFrame,在 Spark SQL 使用 SQL 语言对数据进行过滤和聚合操作。我们使用了 SELECT、WHERE、GROUP BY 和 ORDER BY 这些 SQL 命令来对数据进行查询和操作。在实验,我们了解了如何使用 SQL 语句来进行数据操作,并且学习了如何使用 DataFrame 的 API 来完成相同的任务。 除了 SQL 语句和 DataFrame API,Spark SQL 还支持使用 Spark 自带的 Scala、Java 或 Python 语言来进行编程。我们还了解了在 Spark 如何使用 Scala 语言进行编程,并通过框架提供的 API 执行了简单的任务。 在本次实验,我们学习了操作结构化数据的重要性,并了解了使用 Spark SQL数据进行操作的基础知识。这个实验还为我们打下了在使用 Spark SQL 进行更深入学习的良好基础

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简单点了

谢谢大佬

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值