更新时间:2021年04月14日16时00分 来源:传智教育 浏览次数:
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的数据,具体代码如下所示。
从上述返回结果可以看出,成功过滤出符合大于等于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的操作方式。