筛选数据
既然您已经掌握了一些 SQL 基础,就更容易理解在 Spark DataFrame 中的对应操作了。
来看一下 .filter() 方法。正如您所料,它对应 SQL 的 WHERE 子句。.filter() 可以接收两种参数:一种是作为字符串传入、可写在 SQL 表达式 WHERE 子句后的表达式;另一种是 Spark 的布尔列(True/False)。
例如,下面两种写法会得到相同的结果:
flights.filter("air_time > 120").show()
flights.filter(flights.air_time > 120).show()
注意,第一种情况下,我们向 .filter() 传入的是一个「字符串」。如果用 SQL 来写,这个筛选任务就是 SELECT * FROM flights WHERE air_time > 120。只要以字符串形式传入,Spark 的 .filter() 就能接受任何可以放在 SQL 查询 WHERE 子句中的表达式(在这里是 "air_time > 120")。同时请注意,这个字符串里不需要写表名——就像在 SQL 的 WHERE 子句中一样。
第二种情况下,我们向 .filter() 传入的是一个「布尔值列」。请记住,flights.air_time > 120 会返回一列布尔值,其中 flights.air_time 大于 120 的记录位置为 True,否则为 False。
请记住,您的工作区中已经有一个名为 spark 的 SparkSession,以及一个 Spark DataFrame flights。
本练习是课程的一部分
PySpark 基础
练习说明
- 使用
.filter()以两种方式找出飞行距离超过 1000 英里的航班:- 先向
.filter()传入一个 SQL「字符串」,判断距离是否大于 1000。将结果保存为long_flights1。 - 然后向
.filter()传入一个布尔列,完成相同判断。将结果保存为long_flights2。
- 先向
- 使用
.show()打印两个 DataFrame 的前几行,确认它们确实相同!
交互式实操练习
通过完成这段示例代码来试试这个练习。
# Filter flights by passing a string
long_flights1 = ____.____("____ > ____")
# Filter flights by passing a column of boolean values
long_flights2 = ____.____(____.____ > ____)
# Print the data to check they're equal
____.____()
____.____()