2015-04-22 2 views
8

Я загружаю файлы с большими размерами паркета, но вам нужно всего несколько столбцов. Мой текущий код выглядит следующим образом:Как более эффективно загружать файлы паркета в 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)) 

Моя ментальная модель того, что происходит в том, что она загружается во всех данных, а затем выбрасывая столбцы я не хочу. Я бы предпочел, чтобы он даже не читал в этих колонках, и из того, что я понимаю о паркете, кажется, возможно.

Итак, есть два вопроса:

  1. Является ли моя ментальная модель не так? Или искровый компилятор достаточно умный, чтобы читать только в столбцах a, b и c в примере выше?
  2. Как я могу заставить sqc.parquetFile() читать данные более эффективно?
+0

Я думаю, что ваши шансы получить только для чтения, необходимые столбцы будет выше, если вы '' map' _перед_ filter' – sds

ответ

0

Spark всегда делает что-то ленивым путем, используя собственную функцию scala. Код scala уже скомпилирован, и он делает runtime умным, я имею в виду ленивые решения. С паркета он должен только читать необходимые данные, на которые ссылается код. Конечно, это зависит от структуры конкретного паркетного файла. Дело в том, что он будет использовать столбчатый формат. Я не знаю достаточно о Python, но он должен иметь возможность делать то же самое. Возможно, проверьте, использует ли класс pyspark Row какую-то ленивую магию. Один быстрый способ проверить - выполнить контролируемый эксперимент, написать еще одну операцию rdd, которая ссылается на большее количество полей, но не выдает их. Затем вы можете просто сравнить временную разницу настенных часов между двумя операциями. В зависимости от некоторых релевантных деталей базового файла паркета вы можете не видеть разницу, даже если она делает ленивую загрузку.

0

Да только выбранные поля из диска.

«открывает все файлы данных, но считывает только часть каждого файла, содержащего значения для этого столбца. Значения столбцов сохраняются последовательно, минимизируя ввод-вывод, необходимый для обработки значений в пределах одного столбца».

Эта документация для импала, я думаю, чтение логика одинакова для искры слишком http://www.cloudera.com/documentation/archive/impala/2-x/2-1-x/topics/impala_parquet.html#parquet_data_files_unique_1

Смежные вопросы