Как сжать паркетный файл с помощью zstandard с помощью pandas
Я использую pandas для преобразования фреймов данных в файлы.parquet с помощью этой команды:
df.to_parquet(file_name, engine='pyarrow', compression='gzip')
Мне нужно использовать zstandard в качестве алгоритма сжатия, но приведенная выше функция принимает только gzip, snappy и brotli. Я пробовал. Есть ли способ включить zstd в эту функцию? Если нет, как я могу это сделать с другими пакетами? Я пробовал использовать zstandard, но, похоже, он принимает только байтовые объекты.
3 ответа
Обычно я использую zstandard в качестве алгоритма сжатия моих фреймов данных.
Это код, который я использую (немного упрощенный) для записи этих паркетных файлов:
import pandas as pd
import pyarrow.parquet as pq
import pyarrow as pa
parquetFilename = "test.parquet"
df = pd.DataFrame(
{
"num_legs": [2, 4, 8, 0],
"num_wings": [2, 0, 0, 0],
"num_specimen_seen": [10, 2, 1, 8],
},
index=["falcon", "dog", "spider", "fish"],
)
df = pa.Table.from_pandas(df)
pq.write_table(df, parquetFilename, compression="zstd")
И чтобы прочитать эти паркетные файлы:
import pandas as pd
import pyarrow.parquet as pq
import pyarrow as pa
parquetFilename = "test.parquet"
df = pq.read_table(parquetFilename)
df = df.to_pandas()
Для получения дополнительной информации посетите эти сайты для получения дополнительной информации:
- Интеграция Pandas
- Чтение и запись формата паркета Apache
- pyarrow.parquet.read_table
- pyarrow.parquet.write_table
Наконец-то бессовестная затычка для сообщения в блоге, которое я написал. Речь идет о балансе между скоростью и пространством для zstandard и мгновенного сжатия файлов паркета с использованием pyarrow. Он имеет отношение к вашему вопросу и включает в себя еще несколько "реальных" примеров кода для чтения и записи файлов паркета в zstandard. На самом деле я тоже скоро напишу продолжение. если вам интересно, дайте мне знать.
Вы можете просто использовать
df.to_parquet(file_name, engine='pyarrow', compression='zstd')
Примечание: толькоpyarrow
поддерживает сжатие Zstandard,fastparquet
не.
Чтение еще проще, так как вам не нужно называть алгоритм сжатия:
df = pd.read_parquet(file_name)
До сих пор (Pandas 1.5.3) это было задокументировано только в бэкэнде, начиная с Pandas 1.4.0 . В текущей исправлена недостающая документация в интерфейсе .разрабатываемой версии
Вроде пока не поддерживается:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_parquet.html
сжатие {'snappy', 'gzip', 'brotli', None}, по умолчанию 'snappy' Имя используемого сжатия. Используйте None, чтобы не использовать сжатие.