Является ли запрос к Spark DataFrame на основе CSV быстрее, чем запрос на основе Parquet?

Мне нужно загрузить CSV-файл из HDFS с помощью Spark в DataFrame. Мне было интересно, есть ли улучшение «производительности» (скорость запроса) от DataFrame, поддерживаемого файлом CSV, по сравнению с одним, поддерживаемым файлом parquet?

Обычно я загружаю CSV-файл, как показано ниже, во фрейм данных.

val df1 = sqlContext.read
 .format("com.databricks.spark.csv")
 .option("header", "true")
 .option("inferSchema", "true")
 .load("hdfs://box/path/to/file.csv")

С другой стороны, загрузка паркетного файла (при условии, что я проанализировал CSV-файл, создал схему и сохранил ее в HDFS) выглядит следующим образом.

val df2 = sqlContext.read.parquet("hdfs://box/path/to/file.parquet")

Теперь мне интересно, будут ли затронуты и / или отличаться такие операции, как время следующего запроса.

  • df1.where ("col1 = 'some1'"). count ()
  • df1.where ("col1 = 'some1' и col2 = 'some2'"). count ()

Мне интересно, знает ли кто-нибудь, есть ли предикат-выталкивание для паркета?

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

Приветствуются любые пояснения относительно производительности запросов к кадрам данных с паркетной поддержкой и CSV. Также приветствуется любой формат файла, который поможет ускорить подсчет запросов во фреймах данных.


person Jane Wayne    schedule 16.09.2016    source источник
comment
Никогда, parquets более эффективны, потому что они хранятся column мудро и из-за других факторов. По моему собственному опыту, лучше прочитать набор данных как csv, а затем сохранить его как паркет, а затем прочитать обратно.   -  person Alberto Bonsanto    schedule 17.09.2016
comment
@AlbertoBonsanto Может, тебе стоит ответить. Никогда - действительно сильное слово, но обычно. JaneWayne Да, он поддерживает выталкивание вниз, хотя есть некоторые ограничения в зависимости от версии, особенно при использовании с вложенными объектами. Подсказки: разделение, ведение и сортировка.   -  person zero323    schedule 17.09.2016
comment
CSV будет медленнее, чем parquet по нескольким основным причинам: 1) CSV - это текст и его нужно анализировать построчно (лучше, чем JSON, хуже, чем parquet) 2) указание inferSchema еще больше ухудшает производительность CSV, потому что inferSchema будет прочтите весь файл, чтобы понять, как должна выглядеть схема. 3) 1 большой CSV-файл, сжатый, например, с помощью GZIP, не может быть разделен, поэтому всю работу должен выполнять только 1 исполнитель 4) паркет - столбец ориентированы, поэтому фильтрация по столбцам будет работать непосредственно в пользу паркета 5) сжатие столбцов и блоков в паркете   -  person Garren S    schedule 28.03.2017


Ответы (1)


CSV - это формат, ориентированный на строки, а Parquet - формат на столбцы.

Обычно строковые форматы более эффективны для запросов, которые либо должны обращаться к большей части столбцов, либо читать только часть строк. С другой стороны, форматы, ориентированные на столбцы, обычно более эффективны для запросов, которые должны читать большую часть строк, но иметь доступ только к части столбцов. Аналитические запросы обычно относятся ко второй категории, а транзакционные запросы чаще относятся к первой категории.

Кроме того, CSV - это текстовый формат, который не может быть проанализирован так же эффективно, как двоичный формат. Это делает CSV еще медленнее. С другой стороны, типичный формат, ориентированный на столбцы, является не только двоичным, но и обеспечивает более эффективное сжатие, что приводит к меньшему использованию диска и более быстрому доступу. Я рекомендую прочитать раздел Введение в Разработка и внедрение современных систем баз данных, ориентированных на столбцы.

Поскольку экосистема Hadoop предназначена для аналитических запросов, Parquet, как правило, является лучшим выбором с точки зрения производительности, чем CSV для приложений Hadoop.

person Zoltan    schedule 17.09.2016