Hadoop+Spark大数据技术 第七次作业

第七次作业

复制代码
## 1. 简述Spark SQL使用的数据抽象DataFrame与Dataset的区别。

* DataFrame: 基于 Row 对象的二维表格结构,类似于关系型数据库中的表。 行和列都有明确的 Schema(模式),可以进行类型推断。 提供了丰富的操作接口,如 select、filter、group by、agg 等。 缺点: 需要在操作时进行类型转换,例如使用 col("age").cast("int") 将类型转换为 Int。

* Dataset: 基于特定类型的数据结构,例如 Dataset\[Student\],其中 Student 是一个 case class。 相比 DataFrame,Dataset 能更方便地进行类型推断,无需显式转换。 优点: 代码更简洁,类型安全,编译器可以进行类型检查。 总结: 当需要进行类型安全的操作时,Dataset 是更好的选择。当数据结构复杂,需要进行类型转换时,DataFrame 更灵活。
复制代码
## 2. 简述创建DataFrame对象的常用方法

* 1. Parquet文件创建:使用\`SparkSession\`的\`read.parquet()\`方法从Parquet文件中创建DataFrame。

* 2. json文件创建DataFrame对象:通过\`SparkSession\`的\`read.json()\`方法,可以从JSON文件中读取数据并创建DataFrame。

* 3. RDD创建DataFrame对象:如果有一个RDD,使用\`SparkSession\`的\`createDataFrame()\`方法将其转换为DataFrame。

* 4. SparkSession创建:\`SparkSession\`是Spark 2.0引入的入口点,可以直接用来创建DataFrame。如

* 5. Seq创建DataFrame对象: \`SparkSession\`的\`createDataFrame()\`方法也可以接受一个包含元组的Scala \`Seq\`。
复制代码
## 3. 简述DataFrame对象的常用操作

* 见实验8
复制代码
## 4. 阅读、分析下列各程序段中各语句的功能,并给出运行结果。
python 复制代码
(1) 设grade.json文件的内容如下,给出分析
{"ID":"106","Name":"Ding","Class":"1","Scala":92,"Spark":91}
{"ID":"242","Name":"Yan","Class":"2","Scala":96,"Spark":90}
{"ID":"107","Name":"Feng","Class":"1","Scala":84,"Spark":91}
{"ID":"230","Name":"Wang","Class":"2","Scala":87,"Spark":91}
{"ID":"153","Name":"Zhang","Class":"1","Scala":62,"Spark":71}
{"ID":"242","Name":"Xu","Class":"2","Scala":88,"Spark":90}
{"ID":"235","Name":"Wu","Class":"1","Scala":83,"Spark":91}
{"ID":"224","Name":"Xia","Class":"2","Scala":89,"Spark":91}

val gradeDF=spark.read.json("grade.json")
gradeDF.count()
gradeDF.groupBy("Class").count().show()

(2) 设grade.txt文件的内容如下,给出分析
106,Ding,92,95,91
242,Yan,96,93,90
107,Feng,84,92,91
230,Wang,87,86,91
153,Zhang,85,90,92
224,Men,83,86,90
236,Wang1,87,85,89
210,Han,73,93,88
101,An,84,93,88
127,Pen,81,93,91
237,Du,83,81,85

    val lineRDD = sc.textFile("grade.txt").map{line => line.split(",")}
    val studentRDD = lineRDD.map(x => (x(0).toInt,x(1).toString,x(2).toInt,x(3).toInt,x(4).toInt))
    val studentDF = studentRDD.toDF("ID","Name","Scala","Spark","Python")
    studentDF.show()

(3) 设grade.txt文件的内容与(2)相同,给出分析
case class Student(ID:Int,Name:String,Scala:Int,Spark:Int,Python:Int)
val stuDS = spark.read.textFile("grade.txt")
val studentDataset = stuDS.map(line => {val x = line.split(",");
val ID = x(0).toInt;
val Name = x(1);
val Java = x(2).toInt;
val Scala = x(3).toInt;
val Python = x(4).toInt;
Student(ID,Name,Java,Scala,Python)})
studentDataset.sort(studentDataset("ID").desc).show()

(1)这段代码分析及运行结果:

  • `spark.read.json("grade.json")`:从给定的grade.json文件中读取数据,创建一个DataFrame `gradeDF`。

  • `gradeDF.count()`:返回DataFrame的行数,这里有8行数据。

  • `gradeDF.groupBy("Class").count().show()`:按照"Class"字段对数据进行分组,并计算每组的行数,然后显示结果。

```

+-----+-----+

|Class|count|

+-----+-----+

| 1 | 4 |

| 2 | 4 |

+-----+-----+

```

  • 输出显示有两个班级,每个班级各有4个学生。

(2)这段代码分析及运行结果:

  • `sc.textFile("grade.txt").map{line => line.split(",")}`:读取grade.txt文件,将每一行分割成数组,并创建一个新的RDD `lineRDD`。

  • `lineRDD.map(x => (x(0).toInt,x(1).toString,x(2).toInt,x(3).toInt,x(4).toInt))`:将RDD `lineRDD`中的每个元素(数组)转换为元组,然后创建一个新的RDD `studentRDD`。

  • `studentRDD.toDF("ID","Name","Scala","Spark","Python")`:将`studentRDD`转换为DataFrame `studentDF`,并指定列名。

  • `studentDF.show()`:显示DataFrame `studentDF`的内容。

```

+---+----+-----+-----+-----+

| ID|Name|Scala|Spark|Python|

+---+----+-----+-----+-----+

|106| Ding| 92| 95| 91|

|242| Yan | 96| 93| 90|

|107| Feng| 84| 92| 91|

|230| Wang| 87| 86| 91|

|153|Zhang| 85| 90| 92|

|224| Men | 83| 86| 90|

|236|Wang1| 87| 85| 89|

|210| Han | 73| 93| 88|

|101| An | 84| 93| 88|

|127| Pen | 81| 93| 91|

|237| Du | 83| 81| 85|

+---+----+-----+-----+-----+

```

  • 输出展示了10个学生的信息,包括ID、Name、Scala、Spark和Python的分数。

(3)这段代码分析及运行结果:

  • `case class Student(ID:Int,Name:String,Scala:Int,Spark:Int,Python:Int)`:定义了一个名为`Student`的case class,包含5个字段。

  • `spark.read.textFile("grade.txt")`:读取grade.txt文件,创建RDD `stuDS`。

  • `stuDS.map...`:将RDD `stuDS`中的每一行数据转换为`Student`对象,然后创建一个新的Dataset `studentDataset`。

  • `studentDataset.sort(studentDataset("ID").desc).show()`:按ID字段降序排序`studentDataset`,然后显示结果。

```

+---+----+-----+-----+-----+

| ID|Name|Java |Scala|Python|

+---+----+-----+-----+-----+

|237| Du| 83| 81| 85|

|236|Wang1| 87| 85| 89|

|230| Wang| 87| 86| 91|

|224| Men | 83| 86| 90|

|210| Han | 73| 93| 88|

|127| Pen | 81| 93| 91|

|107| Feng| 84| 92| 91|

|106| Ding| 92| 95| 91

相关推荐
金融Tech趋势派6 小时前
私域运营为主该选哪款企业微信SCRM?2026主流选型测评
大数据·企业微信
计算机源码社6 小时前
【大数据项目实战】基于大数据的影视内容生态综合质量分析与可视化-基于数据挖掘的影视内容类型共现与口碑聚类分析系统
大数据·人工智能·python·数据挖掘·数据分析·毕业设计·课程设计
FII工业富联科技服务8 小时前
GPT-6 Astra发布,Agent的竞争开始从“会调用工具”走向“完成完整工作”
大数据·人工智能·gpt·架构·机器人·制造
QYR-分析9 小时前
蓝海赛道高速扩容!全球小型观察ROV市场格局、细分场景与发展趋势分析
大数据·运维·云计算
Elastic 中国社区官方博客10 小时前
Elasticsearch Python DSL 客户端开发
大数据·数据库·python·elasticsearch·搜索引擎·全文检索
hughnz10 小时前
石油工程的端到端数字化转型:演化还是革命
大数据·人工智能·科技
龙亘川10 小时前
旅游强国建设|一网统管智慧旅游服务模块,赋能节假日文旅数字化治理
大数据·数据库·人工智能·科技·智慧城市·旅游
Databend11 小时前
只看 PASS 会骗你,6 条 Agent Trace 里的 Coding Agent 评测真相
大数据·数据库·agent
数字新视界11 小时前
动环监控可视化技术在机房管理智能化中的实际应用剖析
大数据·人工智能·数据中心·微模块机房·模块化机房