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.