Filtrowanie danych
Skoro masz już trochę doświadczenia z SQL, łatwiej będzie omówić analogiczne operacje na Spark DataFrames.
Przyjrzyjmy się metodzie .filter(). Jak możesz się domyślić, to odpowiednik klauzuli WHERE w SQL. Metoda .filter() przyjmuje albo wyrażenie w postaci łańcucha znaków – takie, które mogłoby wystąpić po WHERE w zapytaniu SQL – albo kolumnę Sparka zawierającą wartości logiczne (True/False).
Na przykład poniższe dwa wyrażenia dają ten sam wynik:
flights.filter("air_time > 120").show()
flights.filter(flights.air_time > 120).show()
Zwróć uwagę, że w pierwszym przypadku do .filter() przekazujemy łańcuch znaków. W SQL odpowiednie zapytanie wyglądałoby tak: SELECT * FROM flights WHERE air_time > 120. Metoda .filter() w Sparku akceptuje każde wyrażenie, które mogłoby znaleźć się w klauzuli WHERE zapytania SQL (tutaj: "air_time > 120"), o ile jest przekazane jako łańcuch znaków.
Zwróć uwagę, że w tym przypadku nie podajemy nazwy tabeli w łańcuchu znaków – tak jak nie podawalibyśmy jej w samym zapytaniu SQL.
W drugim przypadku do .filter() przekazujemy kolumnę wartości logicznych. Pamiętaj, że flights.air_time > 120 zwraca kolumnę wartości logicznych: True dla rekordów w flights.air_time większych niż 120, a False dla pozostałych.
Pamiętaj, że w przestrzeni roboczej masz już dostępny obiekt SparkSession o nazwie spark oraz Spark DataFrame flights.
To ćwiczenie jest częścią kursu
Podstawy PySpark
Instrukcje do ćwiczenia
- Użyj metody
.filter(), aby znaleźć wszystkie loty o dystansie powyżej 1000 mil – na dwa sposoby:- Najpierw przekaż do
.filter()łańcuch znaków w formacie SQL, który sprawdza, czy dystans jest większy niż 1000. Zapisz wynik jakolong_flights1. - Następnie przekaż do
.filter()kolumnę wartości logicznych sprawdzającą to samo. Zapisz wynik jakolong_flights2.
- Najpierw przekaż do
- Użyj
.show(), aby wyświetlić pierwsze wiersze obu DataFrames i sprawdź, czy rzeczywiście zawierają te same dane!
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
# 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
____.____()
____.____()