2017-01-03 1 views
1

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

myDataFrame.select("field1").cache 
myDataFrame.select("field1").count 
myDataFrame.select("field1").where($"field1">5).count 
myDataFrame.select("field1", "field2").where($"field1">5).count 

Четвертая строка не использует кэш.

Любые простые решения, которые могут помочь здесь?

ответ

0

Причина, по которой это не будет кешировать, заключается в том, что всякий раз, когда вы выполняете преобразование на фрейме данных (например, выберите), вы фактически создаете новый. То, что вы в основном делаете, кэшируется файловым фреймом, содержащим только поле1 и фреймворк, содержащий только поле1, где оно больше 5 (возможно, вы имели в виду поле2 здесь, но это не имеет значения).

На четвертой строчке вы создаете третий фрейм данных, который не имеет линии к исходным двум, только к исходному фреймворку данных.

Если вы обычно делаете сильную фильтрацию (т.е. вы получите очень небольшое количество элементов), вы можете сделать что-то вроде этого:

cachedDF = myDataFrame.select("field1", "field2", ... "fieldn").cache 
cachedDF.count() 
filteredDF = cachedDF.filter(some strong filter) 
res = myDataFrame.join(broadcast(filteredDF), cond) 

т.е. cachedDF имеет все необходимые поля фильтрации на, то вы отфильтровывать очень сильно а затем выполните внутреннее соединение (при условии, что все соответствующие выбранные поля или какое-либо поле id) будут давать все соответствующие данные.

В большинстве случаев, если вы используете формат файла, такой как паркет, кеширование не поможет вам.

+0

Спасибо, на самом деле я имел в виду то, что я там написал (field1), , поскольку паркет - это разновидность столбчатого формата, я надеялся получить кеш, который сделает доступ к диску только для полей, не кэшированных. Хотя соединение является возможным решением здесь, это было бы очень дорого в большинстве случаев. – roee