2015-04-22 8 views
8

Ładowanie w plikach parkietu wielowymiarowego, ale potrzebuję tylko kilku kolumn. Mój obecny kod wygląda następująco:Jak wydajniej ładować pliki parkietu w Spark (pySpark v1.2.0)

dat = sqc.parquetFile(path) \ 
      .filter(lambda r: len(r.a)>0) \ 
      .map(lambda r: (r.a, r.b, r.c)) 

mój mentalny model tego, co się dzieje jest to, że w załadunku wszystkich danych, a następnie wyrzucając kolumny nie chcę. Oczywiście wolałbym nie czytać w tych kolumnach, a z tego, co rozumiem, o parkiecie wydaje się to możliwe.

więc istnieją dwa pytania:

  1. Czy mój model mentalny źle? Czy jest to kompilator iskrowy wystarczająco inteligentny, aby czytać tylko w kolumnach a, b i c w powyższym przykładzie?
  2. Jak zmusić sqc.parquetFile() do bardziej wydajnego odczytu danych?
+0

myślę szanse, aby uzyskać potrzebne tylko do odczytu kolumn będzie wyższa, jeśli '' filter' map' _before_ – sds

Odpowiedz

0

Spark zawsze robi rzeczy w leniwy sposób, używając natywnej funkcji scala. Kod scala jest już skompilowany i sprawia, że ​​runtime smart, czyli leniwe, decyzje. W przypadku parkietu powinien tylko odczytać niezbędne dane, do których odnosi się kod. Oczywiście zależy to od struktury konkretnego pliku parkietu. Chodzi o to, że skorzysta z formatu kolumnowego. Nie wiem wystarczająco dużo o Pythonie, ale powinno być w stanie zrobić to samo. Może sprawdź, czy klasa Pyspark Row używa jakiejś leniwej magii. Jednym szybkim sposobem weryfikacji jest wykonanie kontrolowanego eksperymentu, napisanie innej operacji rdd, która odwołuje się do większej liczby pól, ale ich nie wyklucza. Następnie możesz po prostu porównać różnicę czasu zegara ściennego pomiędzy 2 operacjami. W zależności od pewnych istotnych szczegółów leżącego u podstaw pliku parkietu, możesz nie zauważyć różnicy, nawet jeśli leniwie ładuje się.

0

Tak to tylko wybrane pola z dysku.

"otwiera wszystkie pliki danych, ale odczytuje tylko część każdego pliku zawierającego wartości dla tej kolumny. Wartości kolumn są przechowywane kolejno, minimalizując operacje we/wy wymagane do przetwarzania wartości w pojedynczej kolumnie."

Dokumentacja ta jest dla impala, myślę, że czytanie logika jest taka sama dla iskra zbyt http://www.cloudera.com/documentation/archive/impala/2-x/2-1-x/topics/impala_parquet.html#parquet_data_files_unique_1

Powiązane problemy