Файл паркета: какое оптимальное количество файлов для достижения минимального объема - PullRequest
0 голосов
/ 17 июня 2019

Я записал фрейм данных в файл паркета, используя спарк, который имеет 100 подкаталогов (каждый подкаталог содержит один файл) на HDFS.Этот файл имеет 100 ГБ.

Когда я перераспределяю кадр данных на 10 разделов и записываю его в HDFS, размер выходных файлов паркета увеличивается примерно до 200 ГБ.почему это случилось?Какое оптимальное количество разделов при записи в файл паркета?

Мой вопрос отличается от этого вопроса , и я думаю, что он не повторяется.Этот вопрос может быть ответом на первую часть моего вопроса, хотя это не то же самое (почему это происходит?), Но мой главный вопрос: каково оптимальное количество разделов при записи в файл паркета?

1 Ответ

0 голосов
/ 19 июня 2019

Все сводится к использованию.Существует два варианта: есть ли логический идентификатор в моих данных, который будет постоянно использоваться для поиска, или я просто беспокоюсь об эффективности файлов.

(1) Логический идентификатор, если ваши данные имеют столбец (столбцы), которые используются последовательно (т. Е. Время транзакции или время ввода), вы можете разделить эти строки, это позволит вашему процессу быстро проанализироватьданные, позволяющие быстрее запросить время.Недостатком разбиения является то, что переход через 2K, как известно, нарушает такие технологии, как Impala, поэтому не стоит слишком сходить с ума.

(2) Разбиение по размеру, если вы просто оптимизируете размер файла для перемещения по среде и другим сервисам / инструментам.Я бы посоветовал попытаться установить размер данных 128 МБ на раздел.Это позволит быстрее перемещаться по другому инструменту, у которого могут возникнуть проблемы при обработке серии небольших файлов (например, AWS S3).Ниже приведен некоторый код для установки разделов на основе размера данных.

import org.apache.spark.sql.functions._ 
import org.apache.spark.sql.types._ 
import org.apache.spark.sql.DataFrame 
import org.apache.spark.util.SizeEstimator 

val inputDF2 : Long = SizeEstimator.estimate(inputDF.rdd) 
//find its appropiate number of partitions 
val numPartitions : Long = (inputDF2/134217728) + 1 
//write it out with that many partitions  
val outputDF = inputDF.repartition(numPartitions.toInt) 

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

...