学科分类
目录
Spark技术栈

DataFrame的常用操作

DataFrame提供了两种语法风格,即DSL风格语法和SQL风格语法,二者在功能上并无区别,仅仅是根据用户习惯,自定义选择操作方式。接下来,我们通过两种语法风格,分别讲解DataFrame操作的具体方法。

1.DSL风格操作

DataFrame提供了一个领域特定语言(DSL)以方便操作结构化数据,下面将针对DSL操作风格,讲解DataFrame常用操作示例。

  • show():查看DataFrame中的具体内容信息。
  • printSchema():查看DataFrame的Schema信息。
  • select():查看DataFrame中选取部分列的数据。

下面演示查看personDF对象的name字段数据,具体代码如下所示。

scala > personDF.select(personDF.col("name")).show()
+--------+
|  name |
+--------+
|zhangsan|
|   lisi|
| wangwu|
| zhaoliu|
| tianqi|
|  jerry|
+--------+

上述代码中,查询name字段的数据还可以直接使用“personDF.select(“name”).show”代码直接查询。

select()操作还可以实现对列名进行重命名,具体代码如下所示。

scala > personDF.select(personDF("name").as("username"),
personDF("age")).show()
+--------+---+
|username|age|
+--------+---+
|zhangsan| 20|
|  lisi| 29|
| wangwu| 25|
| zhaoliu| 30|
| tianqi| 35|
|  jerry| 40|
+--------+---+

​ 从返回结果看出,原name字段重命名为username字段。

  • filter():实现条件查询,过滤出想要的结果。

下面演示过滤age大于等于25的数据,具体代码如下所示。

scala > personDF.filter(personDF("age") >= 25).show()
+---+-------+---+
| id|  name|age|
+---+-------+---+
| 2|  lisi| 29|
| 3| wangwu| 25|
| 4|zhaoliu| 30|
| 5| tianqi| 35|
| 6| jerry| 40|
+---+-------+---+

从上述返回结果可以看出,成功过滤出符合大于等于25岁的条件数据。

  • groupBy():对记录进行分组。

下面演示按年龄进行分组并统计相同年龄的人数,具体代码如下所示。

scala > personDF.groupBy("age").count().show()
+---+-----+
|age|count|
+---+-----+
| 20|  1|
| 40|  1|
| 35|  1|
| 25|  1|
| 29|  1|
| 30|  1|
+---+-----+

从上述返回结果看出,groupBy()成功统计相同年龄的人数信息。

  • sort():对特定字段进行排序操作。

下面演示按年龄降序排列,具体代码如下所示。

scala > personDF.sort(personDF("age").desc).show()
+---+---------+---+
| id|  name |age|
+---+---------+---+
| 6|  jerry | 40|
| 5|  tianqi  | 35|
| 4| zhaoliu | 30|
| 2|  lisi  | 29|
| 3| wangwu  | 25|
| 1|zhangsan | 20|
+---+--------+---+

从上述返回结果看出,数据成功按照年龄降序排列。

2.SQL风格操作

DataFrame的强大之处就是我们可以将它看作是一个关系型数据表,然后可以在程序中直接使用spark.sql()的方式执行SQL查询,结果将作为一个DataFrame返回。使用SQL风格操作的前提是需要将DataFrame注册成一个临时表,代码如下所示。

scala > personDF.registerTempTable("t_person")

​ 下面通过多个示例,演示使用SQL风格方式操作DataFrame。

(1) 查询年龄最大的前两名人的信息,具体执行代码如下所示。

scala > spark.sql("select * from t_person order by age desc limit 2").show()
+---+------+---+
| id| name|age|
+---+------+---+
| 6| jerry| 40|
| 5|tianqi| 35|
+---+------+---+

(2) 查询年龄大于25的人的信息,具体代码如下所示。

scala > spark.sql("select * from t_person where age > 25").show()
+---+-------+---+
| id|  name|age|
+---+-------+---+
| 2|  lisi| 29|
| 4|zhaoliu| 30|
| 5| tianqi| 35|
| 6| jerry| 40|
+---+-------+---+

DataFrame操作方式简单,并且功能强大,熟悉SQL语法的开发者都能够快速地掌握DataFrame的操作,本小节只讲解了部分常用的操作方式,读者可通过Spark官方文档http://spark.apache.org/docs/latest/sql-programming-guide.html详细学习DataFrame的操作方式。

点击此处
隐藏目录