Чтение/запись файлов паркета с помощью AWS Lambda?

Привет, мне нужна лямбда-функция, которая будет читать и записывать файлы паркета и сохранять их на S3. Я попытался создать пакет развертывания с библиотеками, которые мне нужны для использования pyarrow, но я получаю сообщение об ошибке инициализации для библиотеки cffi:

module initialization error: [Errno 2] No such file or directory: '/var/task/__pycache__/_cffi__x762f05ffx6bf5342b.c'

Могу ли я даже создавать паркетные файлы с помощью AWS Lambda? У кого-нибудь была похожая проблема?

Я хотел бы сделать что-то вроде этого:

import pyarrow as pa
import pyarrow.parquet as pq
import pandas as pd

df = pd.DataFrame([data]) #data is dictionary
table = pa.Table.from_pandas(df)
pq.write_table(table, 'tmp/test.parquet', compression='snappy')
table = pq.read_table('tmp/test.parquet')
table.to_pandas()
print(table)

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


person Community    schedule 28.07.2017    source источник


Ответы (2)


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

https://github.com/andrix/python-snappy/issues/52#issuecomment-342364113

Я получил ту же ошибку при попытке кодирования с помощью snappy из функции Lambda (которая вызывается из каталога, для которого у нее нет прав на запись), включая libsnappy.so.1 в моем zip-файле, разрешив ее.

person Paul Zielinski    schedule 08.11.2017

Для включения зависимостей, необходимых для сжатия/распаковки Snappy, см. ответ Paul Zielinski.

Что касается записи (и чтения) на сам S3, вам также необходимо использовать s3fs (и упаковать его в zip), добавив в свой код следующее:

import s3fs
s3 = s3fs.S3FileSystem()

with s3.open('s3://your-bucket/path/to/test.parquet', 'wb') as f:
    pq.write_table(table, f)

with s3.open('s3://your-bucket/path/to/test.parquet', 'rb') as f:
    table = pq.read_table(f)

Примечание об использовании вами table.to_pandas(): я не верю, что этот метод работает на столе, поэтому, если вы не назначите его (df = table.to_pandas()), он бесполезен.

Наконец, вы также можете использовать следующее для чтения полного (разделенного) набора данных напрямую из S3:

dataset = pq.ParquetDataset(
    'your-bucket/path/to/your/dataset',
    filesystem=s3)
table = dataset.read()

где path/to/your/dataset — это путь к каталогу, содержащему ваш набор данных.

Благодаря Уэсу МакКинни и DrChrisLevy(Github) за это последнее решение, представленное в ARROW-1213!

person Bluu    schedule 07.03.2018
comment
S3 не является файловой системой и не должна использоваться в таком качестве. Не используйте хаки, такие как s3fs — используйте собственный SDK — boto3 в случае с Python. - person gshpychka; 29.04.2021