Skip to content

Commit 28f1a41

Browse files
committed
docs:更新spark专栏
1 parent c8a0f0f commit 28f1a41

File tree

4 files changed

+494
-0
lines changed

4 files changed

+494
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ docs/.vuepress/public/images 存储网站本身展示所需宣传营销图片。
5050
```
5151

5252
注意,该步骤不要带有括号、空格等特殊字符!!!
53+
文章标题是可以有空格的,不然也就没法正常断句了!
5354
### 2.3 本地调试
5455
浏览器前端能正常看到文章,即可提交代码
5556

docs/.vuepress/config.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -971,6 +971,8 @@ module.exports = {
971971
"03-SparkSQL入门",
972972
"04-SparkSQL的API编程之DataFrame",
973973
"05-快速理解SparkSQL的DataSet",
974+
"06-RDD与DataFrame的互操作",
975+
"07-Spark的Data Sources",
974976
]
975977
},
976978
],
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# 06-RDD与DataFrame的互操作
2+
3+
```scala
4+
val spark = SparkSession.builder()
5+
.master("local").appName("DatasetApp")
6+
.getOrCreate()
7+
```
8+
9+
Spark SQL支持两种不同方法将现有RDD转换为DataFrame:
10+
11+
## 1 反射推断
12+
13+
包含特定对象类型的 RDD 的schema。
14+
这种基于反射的方法可使代码更简洁,在编写 Spark 应用程序时已知schema时效果很好
15+
16+
```scala
17+
// 读取文件内容为RDD,每行内容为一个String元素
18+
val peopleRDD: RDD[String] = spark.sparkContext.textFile(projectRootPath + "/data/people.txt")
19+
20+
// RDD转换为DataFrame的过程
21+
val peopleDF: DataFrame = peopleRDD
22+
// 1. 使用map方法将每行字符串按逗号分割为数组
23+
.map(_.split(","))
24+
// 2. 再次使用map方法,将数组转换为People对象
25+
.map(x => People(x(0), x(1).trim.toInt))
26+
// 3. 最后调用toDF将RDD转换为DataFrame
27+
.toDF()
28+
```
29+
30+
## 2 通过编程接口
31+
32+
构造一个schema,然后将其应用到现有的 RDD。
33+
34+
### 2.0 适用场景
35+
36+
虽该法更冗长,但它允许运行时构造 Dataset,当列及其类型直到运行时才知道时很有用。
37+
38+
### 2.1 step1
39+
40+
```scala
41+
// 定义一个RDD[Row]类型的变量peopleRowRDD,用于存储处理后的每行数据
42+
val peopleRowRDD: RDD[Row] = peopleRDD
43+
// 使用map方法将每行字符串按逗号分割为数组,得到一个RDD[Array[String]]
44+
.map(_.split(","))
45+
// 再次使用map方法,将数组转换为Row对象,Row对象的参数类型需要和schema中定义的一致
46+
// 这里假设schema中的第一个字段为String类型,第二个字段为Int类型
47+
.map(x => Row(x(0), x(1).trim.toInt))
48+
```
49+
50+
### 2.2 step2
51+
52+
```scala
53+
// 描述DataFrame的schema结构
54+
val struct = StructType(
55+
// 使用StructField定义每个字段
56+
StructField("name", StringType, nullable = true) ::
57+
StructField("age", IntegerType, nullable = false) :: Nil)
58+
```
59+
60+
### 2.3 step3
61+
62+
使用SparkSession的createDataFrame方法将RDD转换为DataFrame
63+
64+
```scala
65+
val peopleDF: DataFrame = spark.createDataFrame(peopleRowRDD, struct)
66+
67+
peopleDF.show()
68+
```

0 commit comments

Comments
 (0)