Dataframe w Apache PySpark: Kompleksowy samouczek [z przykładami]
Opublikowany: 2020-02-27Dzisiaj dowiemy się o DataFrame w Apache PySpark . Pyspark jest jednym z najlepszych narzędzi do nauki o danych w 2020 roku. Jest to nazwane kolumnami rozproszonej kolekcji wierszy w Apache Spark. Jest bardzo podobny do tabel lub kolumn w arkuszach Excel, a także podobny do tabeli relacyjnej bazy danych. PySpark DataFrame ma również podobne cechy RDD, którymi są:
Rozproszone: natura DataFrame i RDD jest zarówno rozproszona
Oceny leniwe: Wykonanie zadania nie zostanie wykonane, jeśli akcja nie zostanie wykonana
Natura niezmienności: Inną podobną cechą RDD / DataFrame jest to, że nie można jej zmienić po utworzeniu. Ale można zastosować transformację do przekształcenia RDD / DataFrame.
Spis treści
Zaleta ramek danych
1. Obsługuje wiele różnych języków, takich jak Java, Scala, R, Python, co jest przydatne z punktu widzenia obsługi API. Obsługa API dla wielu języków pomaga w pracy z wieloma językami programowania.
2. DataFrame obsługuje szeroką gamę źródeł i formatów danych, co bardzo pomaga w wygodnym korzystaniu z innego źródła danych i ich formatu.
3. Jedną z najlepszych części DataFrame jest to, że może obsługiwać nawet petabajty danych, co jest niezwykłą zdolnością do obsługi tak ogromnych danych.
4. Apache Spark szybko rozumie schemat DataFrame z obserwacją w Spark DataFrame. W nazwanych kolumnach jest zorganizowana obserwacja Spark DataFrame. W ten sposób optymalizowany jest plan wykonania zapytań.
5. Ogromne ilości danych częściowo ustrukturyzowanych i ustrukturyzowanych można szybko przetworzyć, ponieważ są one zaprojektowane do tego DataFrames.
Konfiguracja Apache Spark
Apache Spark należy skonfigurować na komputerze, zanim będzie można go używać do operacji DataFrame. Dane mogą być obsługiwane z obsługą DataFrame, ponieważ obsługuje ona różne operacje DataFrame. Tutaj omówimy kilka typowych operacji DataFrame.
Stworzenie SparkContext to pierwszy krok w programowaniu Apache. Do wykonywania operacji w klastrze wymagany jest SparkContext. Jak uzyskać dostęp do klastra, mówi SparkContext. Pokazuje również Spark o lokalizacji, w której należy uzyskać klaster.
Przeczytaj: Frameworki do głębokiego uczenia
Następnie nawiązywane jest połączenie Apache Cluster. Jego tworzenie jest już wykonane, jeśli używa się Spark Shell. W inny sposób, ustawienie konfiguracji, można podać, zainicjować i zaimportować w celu utworzenia SparkContext.
Do stworzenia można użyć tego kodu:
z pyspark import SparkContext
sc = SparkContext()
Tworzenie DataFrame z pliku CSV
Nowa biblioteka musi być określona w powłoce pythona, aby można było odczytać plik CSV. Aby to zrobić, pierwszym krokiem jest pobranie najnowszej wersji pakietu Spark-CSV i wyodrębnienie pakietu w katalogu macierzystym Sparka. Następnie otworzymy powłokę PySpark i pakiet musi być dołączony.
$ ./bin/pyspark –pakiety com.databricks:spark-csv_2.10:1.3.0
Teraz DataFrame zostanie utworzona po odczytaniu danych z pliku CSV.
train = sqlContext.load(source=”com.databricks.spark.csv”, ścieżka = „PATH/train.csv”, header = True,inferSchema = True)
test = sqlContext.load(source=”com.databricks.spark.csv”, ścieżka = „PATH/test-comb.csv”, nagłówek = True,inferSchema = True)
Testowe pliki CSV i treningowe pliki CSV znajdują się w lokalizacji folderu o nazwie PATH. Jeśli nagłówek znajduje się w pliku CSV, zostanie wyświetlony jako True. Aby poznać typ danych w każdej kolumnie ramki danych, użyjemy opcji inferSchema = True. Używając opcji inferSchema = True, Wykrycie typu danych każdej kolumny ramki danych zostanie wykryte automatycznie przez kontekst SQL. Wszystkie kolumny zostaną odczytane jako ciąg, jeśli nie ustawimy inferSchema na true.
Przeczytaj: Biblioteki Pythona do uczenia maszynowego
Manipulacja DataFrame
Teraz zobaczymy, jak manipulować ramką danych:
- Poznaj typ danych w kolumnach
printSchema zostanie użyty do zobaczenia typu kolumny i jej typu danych. Teraz schemat zostanie wydrukowany w formacie drzewa poprzez zastosowanie printSchema().
train.printSchema()
Wyjście:
źródło
|– User_ID: liczba całkowita (wartość null = prawda)
|– Product_ID: ciąg (wartość null = prawda)
|– Płeć: ciąg (wartość null = prawda)
|– Wiek: ciąg (wartość null = prawda)
|– Zawód: liczba całkowita (wartość null = prawda)
|– City_Category: ciąg (wartość null = prawda)
|– Stay_In_Current_City_Years: ciąg (wartość null = prawda)
|– Stan_małżeński: liczba całkowita (wartość null = prawda)
|– Product_Category_1: liczba całkowita (wartość null = prawda)
|– Product_Category_2: liczba całkowita (wartość null = prawda)
|– Product_Category_3: liczba całkowita (wartość null = prawda)
|– Zakup: liczba całkowita (wartość null = prawda)
Po odczytaniu pliku csv widzimy, że dokładnie otrzymaliśmy typ danych lub schemat każdej kolumny w ramce danych.
- Pokazuję pierwszą obserwację n
Aby zobaczyć pierwsze n obserwacji, można użyć operacji głowy. Praca głowy Pandy jest taka sama jak praca głowy PySpark.
kierownik pociągu(5)
Wyjście:
[Wiersz(User_ID=1000001, Product_ID=u'P00069042′, Płeć=u'F', Wiek=u'0-17′, Zawód=10, City_Category=u'A', Stay_In_Current_City_Years=u'2′, Stan_małżeński= 0, Product_Category_1=3, Product_Category_2=Brak, Product_Category_3=Brak, Zakup=8370),
Wiersz(User_ID=1000001, Product_ID=u'P00248942′, Płeć=u'F', Wiek=u'0-17′, Zawód=10, City_Category=u'A', Stay_In_Current_City_Years=u'2′, Stan_małżeński=0 , Product_Category_1=1, Product_Category_2=6, Product_Category_3=14, Zakup=15200),
Wiersz(User_ID=1000001, Product_ID=u'P00087842′, Płeć=u'F', Wiek=u'0-17′, Zawód=10, City_Category=u'A', Stay_In_Current_City_Years=u'2′, Stan_małżeński=0 , Product_Category_1=12, Product_Category_2=Brak, Product_Category_3=Brak, Zakup=1422),
Wiersz(User_ID=1000001, Product_ID=u'P00085442′, Płeć=u'F', Wiek=u'0-17′, Zawód=10, City_Category=u'A', Stay_In_Current_City_Years=u'2′, Stan_małżeński=0 , Product_Category_1=12, Product_Category_2=14, Product_Category_3=Brak, Zakup=1057),
Wiersz(User_ID=1000002, Product_ID=u'P00285442′, Płeć=u'M', Wiek=u'55+', Zawód=16, City_Category=u'C', Stay_In_Current_City_Years=u'4+', Stan_małżeński=0 , Product_Category_1=8, Product_Category_2=Brak, Product_Category_3=Brak, Zakup=7969)]
Teraz użyjemy operacji show, aby zobaczyć wynik w lepszy sposób, ponieważ wyniki będą miały format wiersza. Możemy również skrócić wynik, używając argumentu truncate = True.
train.show(2,truncate=Prawda)
Wyjście:
+——-+———-+——+—-+———-+————-+————————+————–+——————+ ——————+——————+——–+
|ID_użytkownika|ID_produktu|Płeć| Wiek|Zawód|Miasto_Category|Pobyt_w_obecnym_miasto_lata|Status_małżeński|Product_Category_1|Product_Category_2|Product_Category_3|Zakup|
+——-+———-+——+—-+———-+————-+————————+————–+——————+ ——————+——————+——–+
|1000001| P00069042| F|0-17| 10| A| 2| 0| 3| null| null| 8370|
|1000001| P00248942| F|0-17| 10| A| 2| 0| 1| 6| 14| 15200|
+——-+———-+——+—-+———-+————-+————————+————–+——————+ ——————+——————+——–+
pokazuje tylko 2 górne rzędy
- Zliczanie liczby wierszy DataFrame
Aby policzyć liczbę wierszy w ramce danych, możemy skorzystać z operacji liczenia. Teraz policzymy liczbę wierszy plików testowych i plików szkoleniowych, stosując operację liczenia.
train.count(),test.count()
Wyjście:
(233598, 550069)
Mamy odpowiednio 233598, 550069, wiersze w testach i szkoleniach.
- Uzyskiwanie liczby kolumn i nazw kolumn z pliku testowego i pociągu
Podobnie jak w przypadku operacji kolumny w DataFrame pand, użyjemy operacji kolumn, aby uzyskać nazwę kolumny. Teraz najpierw wydrukujemy nr. kolumny i nazwę kolumny z pliku testowego i pliku pociągu.
len(train.columns), train.columns
Wyjście:
12 ['Identyfikator_użytkownika', 'ID_produktu', 'Płeć', 'Wiek', 'Zawód', 'Miasto_Kategoria', 'Pobyt_w_bieżącej_miasto', 'Status_małżeński', 'Produkt_Kategoria_1', 'Produkt_Kategoria_Produktu'_2', '
Teraz robimy to podobnie dla pliku testowego.
len(test.kolumny), test.kolumny
Wyjście:
13 [”, 'ID_użytkownika', 'ID_produktu', 'Płeć', 'Wiek', 'Zawód', 'Miasto_Kategoria', 'Pobyt_w_bieżącej_miasto', 'Status_małżeński', 'Produkt_Kategoria_1', 'Produkt 'Kategoria_Produktu'_2 ']
Po powyższych danych wyjściowych widzimy, że w pliku szkoleniowym jest 12 kolumn, a w pliku testowym 13 kolumn. Z powyższego wyniku możemy sprawdzić, czy mamy 13 kolumn w pliku testowym i 12 w pliku szkoleniowym. Kolumna „Grzebień” jest jedyną pojedynczą kolumną w pliku testowym, aw pliku testowym nie ma „Zakupu”. W pliku testowym jest jeszcze jedna kolumna, w której widzimy, że nie ma żadnej nazwy kolumny.
- Pobieranie statystyk podsumowujących, takich jak liczba, maks, min, odchylenie standardowe, średnia w kolumnach liczbowych DataFrame
W DataFrame użyjemy operacji o nazwie opisz operację. Możemy wykonać obliczenie kolumny numerycznej i uzyskać podsumowanie statystyczne za pomocą opisu operacji. Wszystkie kolumny liczbowe zostaną obliczone w DataFrame, nie ma nazwy kolumny określonej w obliczeniach statystyk podsumowujących.
train.describe().show()
Wyjście:
+——-+——————+—————–+——————-+—————+——————+——————+—— ————+
|podsumowanie| ID_użytkownika| Zawód| Stan cywilny|Kategoria_produktu_1|Kategoria_produktu_2|Kategoria_produktu_3| Zakup|
+——-+——————+—————–+——————-+—————+——————+——————+—— ————+
| liczba| 550068| 550068| 550068| 550068| 376430| 166821| 550068|

| średnia|1003028,8424013031|8.076706879876669|0.40965298835780306| 5.404270017525106| 9.842329251122386|12.668243206790512| 9263.968712959126|
| stddev|1727.5915855308265|6.522660487341778| 0.4917701263173273|3.9362113692014082| 5.086589648693526| 4.125337631575267|5023.0653938206015|
| min| 1000001| 0| 0| 1| 2| 3| 12|
| maks| 1006040| 20| 1| 20| 18| 18| 23961|
+——-+——————+—————–+——————-+—————+——————+——————+—— ————+
W operacji opisu to właśnie otrzymujemy, gdy podana jest nazwa kolumny ciągu lub nazwa kolumny kategorialnej.
train.describe('ID_produktu').show()
Wyjście:
+——-+———-+
|podsumowanie|ID produktu|
+——-+———-+
| liczba| 550068|
| średnia| null|
| stddev| null|
| min| P00000142|
| maks| P0099942|
+——-+———-+
Na podstawie ASCII obliczono maksymalne i minimalne wartości. Operacja opisu służy do pracy na kolumnie typu String.
- Wybór kolumny DataFrame
Użyjemy nazw kolumn w operacji zaznaczania, aby wybrać kolumnę. Podamy nazwę kolumny z separacją za pomocą przecinków. Teraz zobaczymy, jak dokonuje się wyboru „Wiek” i „Identyfikator użytkownika” z pliku szkoleniowego.
- train.select('User_ID','Wiek').show(5)
- Wyjście:
- +——-+—-+
- |ID_użytkownika| Wiek|
- +——-+—-+
- |1000001|0-17|
- |1000001|0-17|
- |1000001|0-17|
- |1000001|0-17|
- |1000002| 55+|
- +——-+—-+
- Znalezienie Wyraźny nr produktu. w plikach testowych i plikach szkoleniowych
Aby obliczyć numer DataFrame. odrębnych wierszy, użyjemy operacji different. Teraz zastosujemy odrębną operację do obliczenia nie. odrębnego produktu w pliku testowym i szkoleniowym.
train.select('ID_produktu').distinct().count(),test.select('ID_produktu').distinct().count()
Wyjście:
(3633, 3492)
Mamy odpowiednio 3492 i 3633 różne produkty w pliku testowym i szkoleniowym. Teraz wiemy, że w pliku szkoleniowym mamy więcej odrębnych wartości niż plik testowy, o czym możemy się dowiedzieć z wyniku wyjściowego. Teraz użyjemy operacji odejmowania, aby znaleźć kategorie Product_ID, które nie występują w pliku szkoleniowym, ale są obecne w pliku testowym. To samo można zrobić dla wszystkich cech kategorycznych.
diff_cat_in_train_test=test.select('ID_produktu').subtract(train.select('ID_produktu'))
diff_cat_in_train_test.distinct().count()# Dla odrębnej liczby
Wyjście:
46
Tak więc z powyższego wyniku możemy wiedzieć, że istnieje 47 różnych kategorii, które nie są obecne w pliku szkoleniowym, ale są obecne w pliku testowym. Dane zostaną pominięte lub zebrane z pliku testowego, którego nie ma w pliku pociągu.
- Obliczanie częstotliwości parami kolumn kategorialnych?
Zróbmy obliczenie częstotliwości parami kolumny w DataFrame przy użyciu operacji can crosstab. Teraz obliczmy kolumny „Płeć” i „Wiek” w DataFrame pociągu, stosując operację przestawną .
train.crosstab('Wiek', 'Płeć').show()
Wyjście:
+———-+—–+——+
|Wiek_Płeć| F| M|
+———-+—–+——+
| 0-17| 5083| 10019|
| 46-50|13199| 32502|
| 18-25|24628| 75032|
| 36-45|27170| 82843|
| 55+| 5083| 16421|
| 51-55| 9894| 28607|
| 26-35|50752|168835|
+———-+—–+——+
Wyróżniającą się wartością Płeć jest nazwa kolumny, a różną wartością Wiek jest nazwa wiersza, co widać w powyższym wyniku. W tabeli liczba pary będzie wynosić zero, jeśli nie wystąpiła.
Jak uzyskać DataFrame z unikalnymi wierszami?
Aby znaleźć unikalne wiersze i nie uwzględniać zduplikowanych wierszy, użyjemy operacji dropDuplicates . Otrzyma Dataframe bez zduplikowanych wierszy, upuszczając zduplikowane wiersze DataFrame. Sprawdź tutaj, aby dowiedzieć się, jak wykonywana jest procedura dropDuplicates, aby uzyskać wszystkie unikalne wiersze dla kolumn.
train.select('Wiek','Płeć').dropDuplicates().show()
Wyjście:
+—–+——+
| Wiek|Płeć|
+—–+——+
|51-55| F|
|51-55| M|
|26-35| F|
|26-35| M|
|36-45| F|
|36-45| M|
|46-50| F|
|46-50| M|
| 55+| F|
| 55+| M|
|18-25| F|
| 0-17| F|
|18-25| M|
| 0-17| M|
+—–+——+
- Jak upuścić wiersze, które będą miały wartość null?
Jeśli chcemy usunąć wszystkie wiersze, które mają wartość null, możemy użyć operacji zwanej operacją dropna . Aby usunąć wiersz z DataFrame, rozważa trzy opcje.
- Podzbiór – jest to lista wszystkich nazw kolumn, które należy wziąć pod uwagę przy operacji usuwania kolumny z wartościami null.
- Thresh — pomaga to w usuwaniu wierszy z wartościami niezerowymi mniejszymi niż thresh. Domyślnie nic nie jest w tym określone.
- Jak – Może być używany w dwóch rodzajach – wszystkich lub dowolnych. Używając any, usunie wiersz, jeśli jakakolwiek wartość w wierszu ma wartość null. Używając all, zmniejszy wiersz, jeśli wszystkie wartości wierszy są puste.
Teraz użyjemy wszystkich tych opcji jeden po drugim, aby usunąć wiersze, które są puste, używając domyślnych opcji, takich jak subset, thresh, None for how, none, any.
train.dropna().count()
Wyjście:
166821
- Jak wypełnić wartości null DataFrame ze stałą nr?
Aby wypełnić wartości zerowe stałą nr. Użyjemy tutaj operacji fillna . Operacja fillna uwzględnia dwa parametry , aby wypełnić wartości puste.
- podzbiór: Tutaj należy określić kolumny, które należy wziąć pod uwagę przy wypełnianiu wartości.
- value: Tutaj możemy podać kwotę, którą należy zastąpić jaką wartością, która może być dowolnym typem danych, takim jak string, float, int we wszystkich kolumnach.
Tutaj wypełnimy '-1' w miejsce wartości null w DataFrame pociągu.
train.fillna(-1).show(2)
Wyjście:
+——-+———-+——+—-+———-+————-+————————+————–+——————+ ——————+——————+——–+
|ID_użytkownika|ID_produktu|Płeć| Wiek|Zawód|Miasto_Category|Pobyt_w_obecnym_miasto_lata|Status_małżeński|Product_Category_1|Product_Category_2|Product_Category_3|Zakup|
+——-+———-+——+—-+———-+————-+————————+————–+——————+ ——————+——————+——–+
|1000001| P00069042| F|0-17| 10| A| 2| 0| 3| -1| -1| 8370|
|1000001| P00248942| F|0-17| 10| A| 2| 0| 1| 6| 14| 15200|
+——-+———-+——+—-+———-+————-+————————+————–+——————+ ——————+——————+——–+
pokazuje tylko 2 górne rzędy
Wniosek
PySpark nabiera rozpędu w świecie sztucznej inteligencji i uczenia maszynowego. PySpark służy do rozwiązywania rzeczywistych problemów z uczeniem maszynowym. Możesz tworzyć RDD z różnych źródeł danych, zarówno zewnętrznych, jak i istniejących, i wykonywać na nim wszystkie rodzaje transformacji. Mam nadzieję, że ten artykuł był pouczający i był w stanie dać ci głęboki wgląd w ramki danych PySpark.
Jeśli chcesz dowiedzieć się więcej o PySpark i innych narzędziach do nauki o danych, sprawdź dyplom PG IIIT-B i upGrad w dziedzinie nauki o danych, który jest stworzony dla pracujących profesjonalistów i oferuje ponad 10 studiów przypadków i projektów, praktyczne warsztaty praktyczne, mentoring z eksperci branżowi, indywidualni z mentorami branżowymi, ponad 400 godzin nauki i pomocy w pracy z najlepszymi firmami.
Czy PySpark jest bardziej wydajny niż Pandy?
Tak, PySpark jest szybszy niż Pandy, a nawet przewyższa Pandy w teście porównawczym. Zasadniczo Pandas wykonuje operacje na jednej maszynie, podczas gdy PySpark wykonuje operacje na kilku maszynach. Jeśli pracujesz nad aplikacją do uczenia maszynowego z ogromnym zestawem danych, PySpark jest idealnym rozwiązaniem, ponieważ może wykonywać operacje 100 razy szybciej niż Pandas. Dzięki JVM język programowania Scala jest 10 razy szybszy niż Python pod względem analizy i przetwarzania danych. Gdy kod programowania w języku Python jest używany do wywoływania bibliotek Spark, wyniki są mierne.
Jakie są wady korzystania z Apache PySpark?
Spark nie ma własnego systemu zarządzania plikami. Ze względu na wysoki koszt dodatkowej pamięci wymaganej do działania Sparka, przetwarzanie w pamięci może być zbyt kosztowne. Korzystając z Apache Spark z Hadoop, programiści napotykają trudności z kompaktowymi plikami. Dane są iterowane w partiach w Spark, a każda iteracja jest planowana i przetwarzana niezależnie. W Apache Spark dane są dzielone na mniejsze partie we wcześniej ustalonych odstępach czasu. W rezultacie kryteria okien oparte na rekordach nie będą obsługiwane przez Apache. Zamiast tego zapewnia kryteria okna oparte na czasie.
Czym różnią się zestawy danych, DataFrame i RDD?
RDD to klastrowy zbiór elementów danych, który jest rozproszony na wielu komputerach. Dane są reprezentowane przez RDD, które są kolekcją obiektów Java lub Scala. DataFrame to zbiór danych uporządkowanych w nazwane kolumny, które są rozmieszczone na wielu serwerach. W relacyjnej bazie danych jest koncepcyjnie odpowiednikiem tabeli. Dataset to rozszerzenie interfejsu API ramek danych, które oferuje bezpieczny dla typów, zorientowany obiektowo interfejs programistyczny interfejsu API RDD. DataFrame to rozproszony zbiór danych, podobny do RDD, którego nie można modyfikować. Dane są podzielone na nazwane kolumny, podobne do tabeli w relacyjnej bazie danych, a nie RDD. Jeśli chodzi o proste zadania, takie jak grupowanie danych, RDD jest wolniejsze niż zarówno Dataframes, jak i Datasets. Posiada prosty interfejs API do wykonywania zadań agregujących. Może agregować dane szybciej niż RDD i zestawy danych.