資料篩選
既然你已經掌握一些 SQL 基礎,我們就更容易用 Spark 的 DataFrame 來談對應的操作了。
來看看 .filter() 方法。顧名思義,它就是 SQL WHERE 子句在 Spark 中的對應作法。.filter() 可以接受兩種參數:其一是緊接在 SQL WHERE 子句後面的運算式(以字串表示),其二是由布林值(True/False)組成的 Spark 欄位(Column)。
例如,以下兩段程式會得到相同的輸出:
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 查詢中一樣。
第二種情況則是把「布林值欄位」傳給 .filter()。記住,flights.air_time > 120 會回傳一個布林值欄位;在 flights.air_time 大於 120 的紀錄位置為 True,否則為 False。
請記得,你的工作區中已經有名為 spark 的 SparkSession,以及 Spark DataFrame flights。
本練習屬於課程
PySpark 基礎
練習說明
- 用兩種方式用
.filter()找出飛行距離超過 1000 英里的航班:- 先把檢查距離是否大於 1000 的 SQL「字串」傳給
.filter()。將結果存成long_flights1。 - 再把執行相同檢查的布林值欄位傳給
.filter()。將結果存成long_flights2。
- 先把檢查距離是否大於 1000 的 SQL「字串」傳給
- 使用
.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
____.____()
____.____()