Zastanawiam się tylko, jaka jest różnica między RDD
i DataFrame
(Spark 2.0.0 DataFrame to zwykły alias typu Dataset[Row]
) w Apache Spark?
Czy potrafisz konwertować jeden na drugi?
źródło
Zastanawiam się tylko, jaka jest różnica między RDD
i DataFrame
(Spark 2.0.0 DataFrame to zwykły alias typu Dataset[Row]
) w Apache Spark?
Czy potrafisz konwertować jeden na drugi?
A DataFrame
jest dobrze zdefiniowane w wyszukiwaniu w Google „Definicja DataFrame”:
Ramka danych jest tabelą lub dwuwymiarową strukturą tablicową, w której każda kolumna zawiera pomiary jednej zmiennej, a każdy wiersz zawiera jeden przypadek.
A zatem, DataFrame
ma dodatkowe metadane ze względu na swój format tabelaryczny, który pozwala Sparkowi uruchomić pewne optymalizacje na sfinalizowanym zapytaniu.
RDD
, Z drugiej strony, jest jedynie R esilient D istributed D ataset to bardziej Blackboksie danych, które nie mogą być zoptymalizowane do operacji, które można wykonać na nim, nie są ograniczone.
Można jednak przejść z DataFrame do metody RDD
poprzez rdd
, i można przejść z metody RDD
do do DataFrame
(jeśli RDD ma format tabelaryczny) tą toDF
metodą
Zasadniczo zaleca się stosowanie tam, DataFrame
gdzie to możliwe, ze względu na wbudowaną optymalizację zapytań.
Tak .. konwersja pomiędzy
Dataframe
iRDD
jest absolutnie możliwa.Poniżej kilka przykładowych fragmentów kodu.
df.rdd
jestRDD[Row]
Poniżej znajdują się niektóre opcje tworzenia ramki danych.
1)
yourrddOffrow.toDF
konwertuje naDataFrame
.2) Korzystanie
createDataFrame
z kontekstu sqlval df = spark.createDataFrame(rddOfRow, schema)
W rzeczywistości istnieją teraz 3 interfejsy API Apache Spark.
RDD
API:Przykład RDD:
Przykład: Filtruj według atrybutu za pomocą RDD
DataFrame
APIPrzykładowy styl SQL:
df.filter("age > 21");
Ograniczenia: Ponieważ kod odnosi się do atrybutów danych według nazwy, kompilator nie może wykryć żadnych błędów. Jeśli nazwy atrybutów są niepoprawne, błąd zostanie wykryty tylko w czasie wykonywania, gdy tworzony jest plan zapytań.
Inną wadą
DataFrame
interfejsu API jest to, że jest bardzo scentralizowany i chociaż obsługuje Javę, obsługa jest ograniczona.Na przykład podczas tworzenia
DataFrame
z istniejącychRDD
obiektów Java optymalizator Catalyst Spark nie może wywnioskować schematu i zakłada, że dowolne obiekty w DataFrame implementująscala.Product
interfejs. Scalacase class
działa od razu, ponieważ implementuje ten interfejs.Dataset
APIPrzykładowy
Dataset
styl API SQL:Oceny różnią się pomiędzy
DataFrame
iDataSet
:Przepływ poziomu katalizatora. . (Demystifying DataFrame i prezentacja zestawu danych z Spark Summit)
Więcej informacji ... artykuł o bazach danych - Tale of Three Apache Spark APIs: RDDs vs DataFrames and Datasets
źródło
df.filter("age > 21");
można ocenić / przeanalizować tylko w czasie wykonywania. od jego ciągu. W przypadku zestawów danych zestawy danych są zgodne z komponentami bean. więc wiek jest własnością fasoli. jeśli nie ma własności wieku w twojej fasoli, to poznasz ją wcześnie, tj. w czasie kompilacji (tjdataset.filter(_.age < 21);
.). Błąd analizy można zmienić na „Błędy oceny”.Apache Spark zapewnia trzy typy interfejsów API
Oto porównanie interfejsów API między RDD, ramką danych i zestawem danych.
RDD
Funkcje RDD: -
Kolekcja rozproszona:
RDD korzysta z operacji MapReduce, która jest powszechnie stosowana do przetwarzania i generowania dużych zestawów danych za pomocą równoległego, rozproszonego algorytmu w klastrze. Umożliwia użytkownikom pisanie obliczeń równoległych przy użyciu zestawu operatorów wysokiego poziomu, bez martwienia się o rozkład pracy i odporność na uszkodzenia.
Niezmienny: RDD złożone ze zbioru rekordów podzielonych na partycje. Partycja jest podstawową jednostką równoległości w RDD, a każda partycja jest jednym logicznym podziałem danych, który jest niezmienny i utworzony przez pewne przekształcenia istniejących partycji. Niezmienność pomaga osiągnąć spójność obliczeń.
Odporny na awarie: w przypadku utraty części partycji RDD możemy odtworzyć transformację na tej partycji w linii, aby osiągnąć to samo obliczenie, zamiast wykonywać replikację danych w wielu węzłach. Ta cecha jest największą zaletą RDD, ponieważ oszczędza wiele wysiłku w zakresie zarządzania danymi i replikacji, a tym samym osiągania szybszych obliczeń.
Leniwe oceny: wszystkie transformacje w Spark są leniwe, ponieważ nie obliczają od razu swoich wyników. Zamiast tego pamiętają po prostu transformacje zastosowane do jakiegoś podstawowego zestawu danych. Transformacje są obliczane tylko wtedy, gdy akcja wymaga zwrócenia wyniku do programu sterownika.
Transformacje funkcjonalne: RDD obsługują dwa typy operacji: transformacje, które tworzą nowy zestaw danych z istniejącego, oraz akcje, które zwracają wartość do programu sterownika po uruchomieniu obliczeń w zestawie danych.
Formaty przetwarzania danych:
może łatwo i wydajnie przetwarzać zarówno dane ustrukturyzowane, jak i nieustrukturyzowane.
Obsługiwane języki programowania:
API RDD jest dostępne w Javie, Scali, Python i R.
Ograniczenia RDD: -
Brak wbudowanego silnika optymalizacyjnego: podczas pracy z danymi strukturalnymi RDD nie mogą korzystać z zaawansowanych optymalizatorów Spark, w tym optymalizatora katalizatora i silnika wykonawczego wolframu. Programiści muszą zoptymalizować każdy RDD na podstawie jego atrybutów.
Obsługa danych strukturalnych: W przeciwieństwie do ramek danych i zestawów danych, RDD nie wywnioskują schematu pobieranych danych i wymagają od użytkownika ich określenia.
Ramki danych
Spark wprowadził Dataframes w wersji Spark 1.3. Ramka danych pozwala przezwyciężyć kluczowe wyzwania związane z RDD.
Funkcje ramki danych: -
Rozproszony zbiór obiektu Row: DataFrame to rozproszony zbiór danych zorganizowany w nazwane kolumny. Jest to koncepcyjnie odpowiednik tabeli w relacyjnej bazie danych, ale z bogatszymi optymalizacjami pod maską.
Przetwarzanie danych: Przetwarzanie ustrukturyzowanych i nieustrukturyzowanych formatów danych (Avro, CSV, wyszukiwanie elastyczne i Cassandra) oraz systemów pamięci masowej (HDFS, tabele HIVE, MySQL itp.). Może czytać i pisać ze wszystkich tych różnych źródeł danych.
Optymalizacja za pomocą optymalizatora katalizatora: obsługuje zarówno zapytania SQL, jak i interfejs DataFrame API. Ramka danych wykorzystuje szkielet transformacji drzewa katalizatora w czterech fazach,
Zgodność gałęzi: Korzystając ze Spark SQL, możesz uruchamiać niezmodyfikowane zapytania Hive w istniejących magazynach Hive. Ponownie wykorzystuje interfejs Hive i interfejs MetaStore i zapewnia pełną zgodność z istniejącymi danymi Hive, zapytaniami i UDF.
Tungsten: Tungsten zapewnia fizyczny backend wykonawczy, który jawnie zarządza pamięcią i dynamicznie generuje kod bajtowy do oceny wyrażenia.
Obsługiwane języki programowania:
Dataframe API jest dostępne w Javie, Scali, Python i R.
Ograniczenia ramki danych: -
Przykład:
Jest to szczególnie trudne, gdy pracujesz z kilkoma etapami transformacji i agregacji.
Przykład:
Interfejs API zestawów danych
Funkcje zestawu danych: -
Zapewnia najlepsze cechy zarówno RDD, jak i Dataframe: RDD (programowanie funkcjonalne, bezpieczny typ), DataFrame (model relacyjny, optymalizacja zapytania, wykonanie wolframu, sortowanie i tasowanie)
Enkodery: Za pomocą Enkoderów łatwo jest przekonwertować dowolny obiekt JVM na zestaw danych, umożliwiając użytkownikom pracę z danymi zarówno strukturalnymi, jak i nieustrukturyzowanymi, w przeciwieństwie do Dataframe.
Obsługiwane języki programowania: zestawy danych API są obecnie dostępne tylko w Scali i Javie. Python i R nie są obecnie obsługiwane w wersji 1.6. Obsługa języka Python jest przewidziana dla wersji 2.0.
Bezpieczeństwo typu: Zestaw danych API zapewnia bezpieczeństwo czasu kompilacji, które nie było dostępne w ramkach danych. W poniższym przykładzie możemy zobaczyć, jak zestaw danych może działać na obiektach domeny z kompilowanymi funkcjami lambda.
Przykład:
Ograniczenia API zestawów danych: -
Przykład:
Brak obsługi Python i R: Od wersji 1.6 zestawy danych obsługują tylko Scala i Java. Obsługa języka Python zostanie wprowadzona w Spark 2.0.
Interfejs API zestawów danych ma kilka zalet w porównaniu z istniejącym interfejsem RDD i interfejsem Dataframe API, zapewniając lepsze bezpieczeństwo typów i funkcjonalne programowanie. W przypadku wymagań związanych z rzutowaniem typów w interfejsie API nadal nie będzie wymagane bezpieczeństwo typów i spowoduje to, że kod będzie kruchy.
źródło
Dataset
nie jest LINQ, a wyrażenia lambda nie można interpretować jako drzewa wyrażeń. Dlatego istnieją czarne skrzynki i tracisz prawie wszystkie (jeśli nie wszystkie) korzyści związane z optymalizacją. Tylko niewielki podzbiór możliwych wad: Spark 2.0 Dataset vs. DataFrame . Ponadto, aby powtórzyć coś, co powiedziałem wiele razy - ogólnie rzecz biorąc, kompletne sprawdzanie typu nie jest możliwe zDataset
API. Połączenia są tylko najbardziej znanym przykładem.Wszystko (RDD, DataFrame i DataSet) na jednym zdjęciu.
kredyty graficzne
RDD
DataFrame
Dataset
Nice comparison of all of them with a code snippet.
źródło
Tak, oba są możliwe
1.
RDD
doDataFrame
z.toDF()
więcej sposobów: Konwertuj obiekt RDD na ramkę danych w Spark
2
DataFrame
/DataSet
doRDD
z.rdd()
Sposóbźródło
Ponieważ
DataFrame
jest słabo wpisany, a programiści nie czerpią korzyści z tego systemu. Załóżmy na przykład, że chcesz przeczytać coś z SQL i uruchomić na nim agregację:Kiedy mówisz
people("deptId")
, że nie odzyskujeszInt
aniLong
nie odzyskujeszColumn
obiektu, na którym musisz operować. W językach z bogatym systemem typów, takim jak Scala, tracisz bezpieczeństwo typu, co zwiększa liczbę błędów w czasie wykonywania dla rzeczy, które można wykryć w czasie kompilacji.Przeciwnie,
DataSet[T]
jest wpisany. kiedy to zrobisz:W rzeczywistości odzyskujesz
People
obiekt, w którymdeptId
jest to rzeczywisty typ całkowy, a nie typ kolumny, wykorzystując w ten sposób system typów.Począwszy od Spark 2.0, interfejsy API DataFrame i DataSet zostaną ujednolicone, gdzie
DataFrame
będzie alias typuDataSet[Row]
.źródło
Dataframe
to tylko pseudonim dlaDataset[Row]
DataFrame
było uniknięcie łamania zmian API. W każdym razie chciałem tylko to podkreślić. Dzięki za edycję i głosowanie ode mnie.Po prostu
RDD
jest podstawowym składnikiem, aleDataFrame
jest API wprowadzonym w wersji 1.30.RDD
Zbiór partycji danych o nazwie
RDD
. TeRDD
muszą przestrzegać kilka właściwości taki jest:Tutaj
RDD
jest albo ustrukturyzowany, albo nieustrukturyzowany.Ramka danych
DataFrame
jest interfejsem API dostępnym w Scali, Javie, Pythonie i R. Pozwala na przetwarzanie dowolnego typu danych strukturalnych i częściowo ustrukturyzowanych. Aby zdefiniowaćDataFrame
, zbiór danych rozproszonych zorganizowanych w nazwane kolumny o nazwieDataFrame
. Możesz łatwo zoptymalizowaćRDDs
wDataFrame
. Możesz przetwarzać dane JSON, dane parkietu, dane HiveQL jednocześnie za pomocąDataFrame
.Tutaj Sample_DF uważa się za
DataFrame
.sampleRDD
nazywa się (surowe dane)RDD
.źródło
Większość odpowiedzi jest poprawnych, chcę tu dodać tylko jeden punkt
W Spark 2.0 dwa interfejsy API (DataFrame + DataSet) zostaną zjednoczone w jeden interfejs API.
„Unifikacja DataFrame i zestawu danych: W Scali i Javie DataFrame i zestaw danych zostały ujednolicone, tzn. DataFrame jest tylko aliasem typu dla zestawu danych Row. W Pythonie i R, ze względu na brak bezpieczeństwa typu, DataFrame jest głównym interfejsem programistycznym”.
Zestawy danych są podobne do RDD, jednak zamiast serializacji Java lub Kryo używają specjalizowanego enkodera do serializacji obiektów do przetwarzania lub transmisji przez sieć.
Spark SQL obsługuje dwie różne metody konwertowania istniejących RDD na zestawy danych. Pierwsza metoda wykorzystuje odbicie do wnioskowania o schemacie RDD, który zawiera określone typy obiektów. To podejście oparte na refleksji prowadzi do bardziej zwięzłego kodu i działa dobrze, gdy znasz już schemat podczas pisania aplikacji Spark.
Drugą metodą tworzenia zestawów danych jest interfejs programistyczny, który pozwala skonstruować schemat, a następnie zastosować go do istniejącego RDD. Chociaż ta metoda jest bardziej szczegółowa, umożliwia ona tworzenie zestawów danych, gdy kolumny i ich typy nie są znane aż do czasu wykonania.
Tutaj można znaleźć odpowiedź na konwersję z ramką danych RDD
Jak przekonwertować obiekt rdd na ramkę danych w iskrze
źródło
DataFrame jest odpowiednikiem tabeli w RDBMS i może być również manipulowany w podobny sposób jak „natywne” kolekcje rozproszone w RDD. W przeciwieństwie do RDD, ramki danych śledzą schemat i obsługują różne operacje relacyjne, które prowadzą do bardziej zoptymalizowanego wykonania. Każdy obiekt DataFrame reprezentuje logiczny plan, ale ze względu na jego „leniwą” naturę wykonywanie nie następuje, dopóki użytkownik nie wywoła określonej „operacji wyjściowej”.
źródło
Kilka spostrzeżeń z perspektywy użytkowania, RDD vs DataFrame:
Mam nadzieję, że to pomoże!
źródło
Ramka danych to RDD obiektów Row, z których każdy reprezentuje rekord. Ramka danych zna również schemat (tj. Pola danych) swoich wierszy. Podczas gdy ramki danych wyglądają jak zwykłe RDD, wewnętrznie przechowują dane w bardziej wydajny sposób, wykorzystując ich schemat. Ponadto zapewniają nowe operacje niedostępne na RDD, takie jak możliwość uruchamiania zapytań SQL. Ramki danych można tworzyć z zewnętrznych źródeł danych, z wyników zapytań lub ze zwykłych RDD.
Odnośnik: Zaharia M., i in. Learning Spark (O'Reilly, 2015)
źródło
Spark RDD (resilient distributed dataset)
:RDD jest podstawowym interfejsem API do pozyskiwania danych i jest dostępny od pierwszego wydania Spark (Spark 1.0). Jest to interfejs API niższego poziomu do manipulowania rozproszonym zbieraniem danych. Interfejsy API RDD ujawniają niektóre niezwykle przydatne metody, których można użyć, aby uzyskać bardzo ścisłą kontrolę nad fizyczną strukturą danych. Jest to niezmienny (tylko do odczytu) zbiór podzielonych na partycje danych dystrybuowanych na różnych komputerach. RDD umożliwia obliczenia w pamięci dużych klastrów, aby przyspieszyć przetwarzanie dużych danych w sposób odporny na uszkodzenia. Aby włączyć odporność na uszkodzenia, RDD używa DAG (Directed Acyclic Graph), który składa się z zestawu wierzchołków i krawędzi. Wierzchołki i krawędzie w DAG reprezentują odpowiednio RDD i operację, którą należy zastosować na tym RDD. Transformacje zdefiniowane na RDD są leniwe i są wykonywane tylko po wywołaniu akcji
Spark DataFrame
:Spark 1.3 wprowadził dwa nowe interfejsy API do pozyskiwania danych - DataFrame i DataSet. Interfejsy API DataFrame organizują dane w nazwane kolumny jak tabela w relacyjnej bazie danych. Umożliwia programistom zdefiniowanie schematu na rozproszonym zbiorze danych. Każdy wiersz w ramce danych ma wiersz typu obiektu. Podobnie jak tabela SQL, każda kolumna musi mieć taką samą liczbę wierszy w ramce danych. W skrócie, DataFrame to leniwie oceniany plan, który określa operacje, które należy wykonać na rozproszonym zbiorze danych. DataFrame to także niezmienna kolekcja.
Spark DataSet
:Jako rozszerzenie API DataFrame, Spark 1.3 wprowadził również API DataSet, które zapewniają ściśle typowy i obiektowy interfejs programistyczny w Spark. Jest to niezmienne, bezpieczne dla typu zbieranie rozproszonych danych. Podobnie jak DataFrame, interfejsy API DataSet również wykorzystują silnik Catalyst w celu umożliwienia optymalizacji wykonywania. DataSet to rozszerzenie interfejsów API DataFrame.
Other Differences
-źródło
DataFrame jest RDD który ma schematu. Możesz myśleć o tym jak o tabeli relacyjnej bazy danych, ponieważ każda kolumna ma nazwę i znany typ. Potęga DataFrames wynika z faktu, że podczas tworzenia DataFrame ze strukturalnego zestawu danych (Json, Parquet ..) Spark jest w stanie wywnioskować schemat, przechodząc przez cały zestaw danych (Json, Parquet ..) jest ładowany. Następnie, podczas obliczania planu wykonania, Spark może korzystać ze schematu i wykonywać znacznie lepsze optymalizacje obliczeń. Należy pamiętać, że DataFrame był nazywany SchemaRDD przed Spark v1.3.0
źródło
Apache Spark - RDD, DataFrame i DataSet
Spark RDD -
Spark Dataframe -
Spark Dataset -
źródło
Możesz używać RDD z danymi strukturalnymi i nieustrukturyzowanymi, gdzie jako ramka danych / zestaw danych może przetwarzać tylko dane ustrukturyzowane i częściowo ustrukturyzowane (ma odpowiedni schemat)
źródło
Wszystkie świetne odpowiedzi i używanie każdego API ma pewne kompromisy. Zestaw danych jest zbudowany jako super API, aby rozwiązać wiele problemów, ale wiele razy RDD nadal działa najlepiej, jeśli rozumiesz swoje dane, a jeśli algorytm przetwarzania jest zoptymalizowany do wykonywania wielu rzeczy w jednym przejściu do dużych danych, RDD wydaje się najlepszą opcją.
Agregacja za pomocą interfejsu API zestawu danych nadal zużywa pamięć i z czasem będzie się poprawiać.
źródło