Spark читает Python3 Pickle в качестве входных данных

Мои данные доступны в виде наборов маринованных файлов Python 3. Большинство из них - сериализация панд DataFrames,

Я хотел бы начать использовать Spark, потому что мне нужно больше памяти и процессора, которые может иметь один компьютер. Также я буду использовать HDFS для распределенного хранилища.

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

Это существует? Если нет, есть ли обходной путь?

большое спасибо

1 ответ

Решение

Многое зависит от самих данных. Вообще говоря, Spark не особенно хорошо работает, когда ему приходится читать большие, не разделяемые файлы. Тем не менее вы можете попробовать использовать binaryFiles метод и объединить его со стандартными инструментами Python. Начнем с фиктивных данных:

import tempfile
import pandas as pd
import numpy as np

outdir = tempfile.mkdtemp()

for i in range(5):
    pd.DataFrame(
        np.random.randn(10, 2), columns=['foo', 'bar']
    ).to_pickle(tempfile.mkstemp(dir=outdir)[1])

Далее мы можем прочитать это с помощью bianryFiles метод:

rdd = sc.binaryFiles(outdir)

и десериализовать отдельные объекты:

import pickle
from io import BytesIO

dfs = rdd.values().map(lambda p: pickle.load(BytesIO(p)))
dfs.first()[:3]

##         foo       bar
## 0 -0.162584 -2.179106
## 1  0.269399 -0.433037
## 2 -0.295244  0.119195

Одним из важных замечаний является то, что обычно требуется значительно больше памяти, чем простые методы, такие как textFile,

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

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

Примечание:

SparkContext обеспечивает pickleFile метод, но название может вводить в заблуждение. Может использоваться для чтения SequenceFiles содержащие объекты рассола, а не простые огурцы Python.

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