データのフィルタリング
ここまででSQLの基礎がわかってきましたので、Spark DataFrameで同等の操作を行う方法を見ていきます。
ここでは .filter() メソッドを確認します。名前から想像できるように、これはSQLの WHERE 句に相当します。.filter() は、SQL式の WHERE 句に続くような式を文字列として渡すか、Sparkの真偽値(True/False)のカラムを渡すことができます。
例えば、次の2つの式は同じ出力になります。
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でも同様です。
2つ目のケースでは、.filter() に 真偽値のカラム を渡しています。flights.air_time > 120 は、flights.air_time の各レコードが120を超える場合に True、それ以外は False になる真偽値のカラムを返すことを思い出してください。
SparkSession の spark はすでにワークスペースに用意されており、Spark DataFrame の flights も利用できます。
この演習はコースの一部です
PySpark入門
演習の手順
.filter()メソッドを使って、1000マイルを超えて飛行した便を2通りの方法で取得します。- まず、距離が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
____.____()
____.____()