Ручной выбор паркетных разделов против их фильтрации в pyspark

#pyspark #parquet #hadoop-partitioning

#apache-spark #pyspark #паркет #hadoop-разделение

Вопрос:

Это может быть глупый вопрос, но есть ли какая-либо разница между ручным указанием столбцов разделов в файле parquet, в отличие от его загрузки и последующей их фильтрации?

Например: у меня есть файл parquet, который разделен на DATE . Если мне нужны последние 10 дней, я обычно могу сделать следующее: (предполагая, что сегодня 2020-10-26)

 df=spark.read.parquet("s3://bucket/path/file.parquet")
.filter(col('DATE')>'2020-10-15')
  

Или я могу использовать файловую систему S3 для загрузки только необходимых разделов в фрейм данных spark следующим образом:

 inpath="s3://bucket/path/file.parquet/"
datepath=s3fs.S3FileSystem.ls(inpath)
dates=[]
for a in range(len(datepath)-10, len(datepath)):
    path="s3://"   datepath[a]   "/"
    dates=append(path)
df=spark.read.option("basePath", inpath).parquet(*dates)
  

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

Пожалуйста, посоветуйте. Спасибо

Ответ №1:

Вы можете делать и то, и другое, но Spark predicate push-down существует уже некоторое время, что упрощает вашу жизнь. Например, обрезка разделов и использование параметров паркета, таких как min / max. См. https://db-blog.web.cern.ch/blog/luca-canali/2017-06-diving-spark-and-parquet-workloads-example с 2017 года, и это также относится к pyspark.

Не все, что можно убрать, но другие операторы, которые можно убрать, это «<, <=, > , >=» как показывает ссылка из 2017 года. Вы можете использовать .explain , чтобы проверить, как оптимизатор применяет или не применяет нажатие на предикат.

Комментарии:

1. Таким образом, можно не только значительно сократить время ввода-вывода за счет фильтрации по разделам, но и фильтрации по неразделенным столбцам, если типы данных допустимы и данные распределены неравномерно. Это экономит мне кучу строк кода без использования method 2 . Спасибо за эту информацию!