Разделение большого файла CSV и преобразование в несколько файлов Parquet — безопасно?

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

И он, возможно, генерирует несколько файлов, скажем, из одного ввода, например, из кадра данных Panda.

Теперь у меня есть большой файл CSV, и я хочу преобразовать его в формат файла паркета. Наивно, я бы удалил заголовок (сохранил в другом месте на потом) и разбил файл на блоки по n строк. Затем превратите каждый кусок в паркет (здесь Python):

table = pyarrow.csv.read_csv(fileName)
pyarrow.parquet.write_table(table, fileName.replace('csv', 'parquet'))

Я думаю, метод не имеет большого значения. Из того, что я вижу, по крайней мере, с небольшим набором тестовых данных и без дополнительного контекста, я получаю один файл паркета на файл csv (1: 1).

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

Должен ли я как минимум читать заголовок для каждого фрагмента CSV?

Это так просто, как я думаю, или я что-то упускаю?

Ты пробовал? pd.read_parquet работает очень интуитивно. Вам не нужно удалять заголовок или раздел вручную (если заголовок — это имена столбцов, просто оставьте их там — паркет хранит имена столбцов).

Michael Delgado 30.11.2022 16:35

Да, вопрос в том, должен ли я повторять заголовок во всех фрагментах или полностью его убрать? Поскольку там не 1, а N файлов...

raoulsson 01.12.2022 14:43

@raoulsson, зачем тебе несколько файлов паркета? Таким образом, вы всегда будете получать одну паркетную пилку.

ns15 01.12.2022 15:43

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

ns15 01.12.2022 15:46

@ shetty15 Мне нужно разделить это, да, в этом суть. Почему бы не поместить свой комментарий в ответ, и я приму его? Спасибо

raoulsson 01.12.2022 16:36

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

Michael Delgado 01.12.2022 17:11

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

raoulsson 01.12.2022 17:15

Запись в один файл с несколькими группами строк будет работать. Однако приложение, которое позже будет читать этот файл, должно поддерживать такие функции, как сокращение групп строк. Как вы планируете читать/обрабатывать эти файлы после их создания?

ns15 01.12.2022 17:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
8
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Простой способ написать секционированный файл паркета — это 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 так как он был первым. Но отличное дополнение, может быть, это практически лучший способ. Никакой сверхинженерии с моей стороны...

raoulsson 01.12.2022 18:21
Ответ принят как подходящий

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

Обратите внимание, что паркет — это сжатый формат (с высокой степенью сжатия). Данные Parquet будут намного меньше, чем данные csv. Кроме того, приложения, которые читают паркетные файлы, обычно предпочитают меньше больших паркетных файлов и меньше маленьких паркетных файлов.

Другие вопросы по теме