Я узнал, что формат файла паркета хранит кучу метаданных и использует различные способы сжатия для эффективного хранения данных, когда речь идет о размере и скорости запросов.
И он, возможно, генерирует несколько файлов, скажем, из одного ввода, например, из кадра данных Panda.
Теперь у меня есть большой файл CSV, и я хочу преобразовать его в формат файла паркета. Наивно, я бы удалил заголовок (сохранил в другом месте на потом) и разбил файл на блоки по n строк. Затем превратите каждый кусок в паркет (здесь Python):
table = pyarrow.csv.read_csv(fileName)
pyarrow.parquet.write_table(table, fileName.replace('csv', 'parquet'))
Я думаю, метод не имеет большого значения. Из того, что я вижу, по крайней мере, с небольшим набором тестовых данных и без дополнительного контекста, я получаю один файл паркета на файл csv (1: 1).
На данный момент это все, что мне нужно, так как я не делаю запросы ко "всему" логическому набору данных. Я использую необработанные файлы в качестве исходных данных для дальнейшего шага очистки, который отлично подходит для формата csv. И я еще не пробовал читать файлы ...
Должен ли я как минимум читать заголовок для каждого фрагмента CSV?
Это так просто, как я думаю, или я что-то упускаю?
Да, вопрос в том, должен ли я повторять заголовок во всех фрагментах или полностью его убрать? Поскольку там не 1, а N файлов...
@raoulsson, зачем тебе несколько файлов паркета? Таким образом, вы всегда будете получать одну паркетную пилку.
Если вы хотите разделить CSV на несколько файлов паркета, вам также придется включить заголовки. Заголовки не могут быть опущены.
@ shetty15 Мне нужно разделить это, да, в этом суть. Почему бы не поместить свой комментарий в ответ, и я приму его? Спасибо
Но почему бы просто не использовать несколько групп рядов на паркете? Parquet предоставляет средства эффективного предоставления доступа к определенным столбцам или блокам строк при чтении. Не должно быть необходимости разбивать файл на несколько пакетов вручную.
@MichaelDelgado Я бы согласился, но файл может быть слишком большим, и я хотел бы обрабатывать его параллельно, если это возможно. Это то, что мне нужно знать, если это военно-морская идея, поскольку паркет может принести больше пользы, чем я ожидал ... (плюс мои клиенты нуждаются в том, чтобы на это был дан общий ответ)
Запись в один файл с несколькими группами строк будет работать. Однако приложение, которое позже будет читать этот файл, должно поддерживать такие функции, как сокращение групп строк. Как вы планируете читать/обрабатывать эти файлы после их создания?
Простой способ написать секционированный файл паркета — это dask.dataframe . Вы даже можете прочитать данные с помощью dask.dataframe.read_csv, и тогда вам не нужно делать никаких преобразований:
import dask.dataframe
# here, the block size will determine the partition boundaries, which will
# be preserved in the parquet file. So if you have a 5 GB file, this would
# write 50 partitions:
df = dask.dataframe.read_csv(fileName, blocksize = "100MB")
df.to_parquet(fileName.replace(".csv", ".parquet"))
спасибо, оба большие, дал "принято" shetty15 так как он был первым. Но отличное дополнение, может быть, это практически лучший способ. Никакой сверхинженерии с моей стороны...
При создании набора данных паркета с несколькими файлами все файлы должны иметь совпадающую схему. В вашем случае, когда вы разделяете файл csv на несколько файлов паркета, вам нужно будет включить заголовки csv в каждый фрагмент, чтобы создать действительный файл паркета.
Обратите внимание, что паркет — это сжатый формат (с высокой степенью сжатия). Данные Parquet будут намного меньше, чем данные csv. Кроме того, приложения, которые читают паркетные файлы, обычно предпочитают меньше больших паркетных файлов и меньше маленьких паркетных файлов.
Ты пробовал? pd.read_parquet работает очень интуитивно. Вам не нужно удалять заголовок или раздел вручную (если заголовок — это имена столбцов, просто оставьте их там — паркет хранит имена столбцов).