Selecting II
和 SQL 類似,你也可以使用 .select() 方法進行欄位層級的運算。當你使用 df.colName 標記法選取欄位時,你可以對該欄位執行任意運算,而 .select() 會回傳轉換後的欄位。例如,
flights.select(flights.air_time/60)
會回傳以小時計算的航班時間欄位,而不是以分鐘。你也可以用 .alias() 方法重新命名選取的欄位。因此,如果你想要 .select() 名為 duration_hrs(目前不在你的 DataFrame 中)的欄位,可以這樣寫:
flights.select((flights.air_time/60).alias("duration_hrs"))
等價的 Spark DataFrame 方法 .selectExpr() 會接受字串形式的 SQL 運算式:
flights.selectExpr("air_time/60 as duration_hrs")
其中 SQL 的 as 關鍵字等同於 .alias() 方法。若要選取多個欄位,可以傳入多個字串。
請記得,名為 spark 的 SparkSession 已經在你的工作環境中,還有 Spark DataFrame flights。
本練習屬於課程
PySpark 基礎
練習說明
建立一個同時包含每趟航班平均速度的資料表(兩種方式)。
- 以
distance除以(轉換為小時的)air_time計算平均速度。使用.alias()方法將此欄位命名為"avg_speed"。將輸出儲存為變數avg_speed。 - 選取欄位
"origin", "dest", "tailnum",以及 avg_speed(不要加引號!)。將結果儲存為speed1。 - 使用
.selectExpr()和包含 SQL 運算式的字串,建立相同的資料表。將結果儲存為speed2。
動手互動練習
試著完成這個範例程式碼,體驗一下這個練習。
# Define avg_speed
avg_speed = (flights.____/(flights.____/60)).alias("____")
# Select the correct columns
speed1 = flights.select("origin", "dest", "tailnum", avg_speed)
# Create the same table using a SQL expression
speed2 = flights.selectExpr("____", "____", "____", "distance/(air_time/60) as ____")