Причина, по которой это не будет кешировать, заключается в том, что всякий раз, когда вы выполняете преобразование на фрейме данных (например, выберите), вы фактически создаете новый. То, что вы в основном делаете, кэшируется файловым фреймом, содержащим только поле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) будут давать все соответствующие данные.
В большинстве случаев, если вы используете формат файла, такой как паркет, кеширование не поможет вам.
Спасибо, на самом деле я имел в виду то, что я там написал (field1), , поскольку паркет - это разновидность столбчатого формата, я надеялся получить кеш, который сделает доступ к диску только для полей, не кэшированных. Хотя соединение является возможным решением здесь, это было бы очень дорого в большинстве случаев. – roee