2015-06-18 13 views
19

Właśnie zacząłem z DataFrame wczoraj i naprawdę podoba mi się to do tej pory.Spark DataFrames: registerTempTable vs not

ja nie rozumiem jednej rzeczy, choć ... (Powołując się na przykład w „Programowo Określanie schematu” tutaj: https://spark.apache.org/docs/latest/sql-programming-guide.html#programmatically-specifying-the-schema)

W tym przykładzie dataframe jest zarejestrowany jako stół (zgaduję, aby zapewnić dostęp do zapytań SQL ..?), ale dokładnie te same informacje, które są dostępne, mogą być również wykonane przez peopleDataFrame.select ("name").

Pytanie brzmi .. Kiedy chciałbyś zarejestrować ramkę danych jako tabelę zamiast tylko używać podanych funkcji ramek danych? I czy jedna opcja jest bardziej wydajna niż druga?

Odpowiedz

19

Powodem użyć metody registerTempTable(tableName) dla DataFrame, jest tak, że oprócz możliwości korzystania z metod zapłonie warunkiem o DataFrame, można również wydać SQL zapytań metodą sqlContext.sql(sqlQuery), które używają tego DataFrame jako tabela SQL. Parametr tableName określa nazwę tabeli używanej dla tej DataFrame w zapytaniach SQL.

val sc: SparkContext = ... 
val hc = new HiveContext(sc) 
val customerDataFrame = myCodeToCreateOrLoadDataFrame() 
customerDataFrame.registerTempTable("cust") 
val query = """SELECT custId, sum(purchaseAmount) FROM cust GROUP BY custId""" 
val salesPerCustomer: DataFrame = hc.sql(query) 
salesPerCustomer.show() 

czy używać SQL lub DataFrame metod takich jak select i groupBy jest prawdopodobnie w dużej mierze kwestia preferencji. Rozumiem, że zapytania SQL są tłumaczone na plany wykonania Spark.

W moim przypadku odkryłem, że niektóre rodzaje zapytań dotyczących agregacji i okien, które były mi potrzebne, takie jak obliczanie salda bieżącego na klienta, były dostępne w języku zapytań Hive SQL, co, jak podejrzewam, byłoby bardzo trudne w Iskra.

Jeśli chcesz używać SQL, najprawdopodobniej będziesz chciał utworzyć HiveContext zamiast zwykłego SQLContext. Język zapytań Hive obsługuje szerszy zakres SQL niż dostępny za pomocą zwykłego SQLContext.

+0

Więc SQLContext to własna implementacja silnika SQL (parser, optymalizator, executor itp.), Prawda? Co się stanie, gdy użyjesz HiveContext? Czy wykonanie kwerendy sql jest delegowane do Hive? Natknąłem się na czytanie, które mówi, że rozmieszczenie ula nie jest wymagane przy użyciu HiveContext. Jak wtedy działają wewnętrznie? –

0

Jest ładny odniesienia porównując RDD vs. dataframe vs. wydajności SparkSQL:


Spark RDDs vs DataFrames vs SparkSQL

Widocznie GroupBy z liczenia i sortowania grup była zauważalnie szybciej SparkSQL.

Jeśli wykonujesz zadanie o znaczeniu krytycznym, może to mieć sens, aby zaimplementować je w obu sposób, porównując czas i wydajność.