2017-01-14 12 views
10

To jest kwestia optymalizacji, to jest mój obecny (pracy) sytuacja:Spark, optymalizacji generacji dane z DF

  • Spark jest uruchomiony w trybie autonomicznym korzystania z zapłonem jobserver;
  • Mam plik parkietu z ~ 3M wierszy zapisanych w pamięci jako tabela;
  • Tabela jest kompresją wszystkich danych z witryny e-commerce, każdy wiersz reprezentuje użytkownika, ale użytkownik może mieć więcej wierszy;

Żądanie klienta jest przeprowadzenie kwerendy SQL i mają wyniki wyświetlane na stronie internetowej w niektórych tabelach, każdy reprezentujący metryki z licznikiem, jak:

wiek => 18-20 : 15 użytkowników, 21-35: 42 użytkowników, ...

Country => USA: 22 GB, użytkownicy: 0 użytkowników, ...

I tak dalej. Licząc wszystkie tabele (wraz z niektórymi sesjami użytkowników, które są generowane na podstawie aktywności, okresu i roku) mamy obecnie ~ 200 metryk.

Ostatni wydany system zastosowań produkcyjnych (biorąc pod uwagę DF jako DataFrame wynikające z zapytania SQL)

df.rdd.aggregate(metricsMap) (

     (acc: MetricsMap, r:Row) => { 
     acc.analyzeRow(r) 
     acc 
     }, 

     (acc1: MetricsMap, acc2: MetricsMap) => { 
     acc1.merge(acc2) 
     acc1 
     } 
    ) 

przypadku MetricsMap Przedmiotem stosowane do odprowadzania i dane zbiorcze z rzędu.

Ta operacja jest bardzo obciążająca procesor, a na serwerze trwa to ~ 20 sekund, aby wyodrębnić dane z zapytania bez parametrów (czyli ze wszystkich danych w pliku parkietu).

Zdecydowałem się użyć agregacji, ponieważ dla potrzeb analizy statystycznej poszukiwano wielu perspektyw: niektóre dane powinny być liczone według klucza użytkownika, inne według nazwy użytkownika (dla witryny ...), a drugie według klucza produktu . Używając tej metody musiałem cyklicznie przechodzić przez wynik tylko jeden raz, ale nie wiem, czy to jest lepsze podejście ...

Czy to jest lepsze podejście, czy istnieje jakaś inna (szybsza) metoda uzyskania ten sam wynik?

Jeśli chodzi o pytanie dotyczące wcześniejszego obliczania metryk, zapytania, które mogą wykonać na zbiorze danych, nie są związane, więc nie wiem, czy to możliwe, czy nie ... Czy mógłbyś podać mi przykład?

Odpowiadając na niektóre pytania

+3

Czy możesz podać trochę więcej informacji na temat agregacji? Zasadniczo czy istnieje powód, dla którego powracasz do programu rdd zamiast pracować na poziomie architektury danych/SQL? –

+0

Czy możesz wstępnie obliczać dane? –

Odpowiedz

0

jedna ścieżka danych w takich przypadkach jest oczywiście lepsze niż mieć wiele cykli, w przypadkach, chcesz odpowiedzieć na wiele pytań dotyczących samego wniosku.

Może być wydajniejszy, ale nie współdziała z iskrowym rdzeniem.

Na przykład, jeśli twój schemat DF jest w następujący sposób:

root 
-- age 
-- country 

Następnie można spróbować wykonać następujące pseudo zapytanie Base:

Select 
CASE WHEN (age BETWEEN 18 AND 22) THEN '18-22' 
    WHEN (age BETWEEN 22 AND 30) THEN '22-30' 
    ELSE 'Other' as age_group, 
country 
from metrics_df 

Można również rozważyć użycie UDF dla Grupa wiekowa. Jak wspomniano o @ assaf-mendelson, więcej informacji byłoby użytecznych tutaj.

Powiązane problemy