Spark DataFrame в массив numpy через udf или без сбора в драйвер - PullRequest
0 голосов
/ 28 февраля 2020

Real life df - это массив данных, который нельзя загрузить в память драйвера. Это можно сделать с помощью обычного или pandas udf?

# Code to generate a sample dataframe

from pyspark.sql import functions as F
from pyspark.sql.types import *
import pandas as pd
import numpy as np

sample = [['123',[[0,1,0,0,0,1,1,1,1,1,1,0,1,0,0,0,1,1,1,1,1,1], [0,1,0,0,0,1,1,1,1,1,1,0,1,0,0,0,1,1,1,1,1,1]]],
      ['345',[[1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,1,1], [0,1,0,0,0,1,1,1,1,1,1,0,1,0,0,0,1,1,1,1,1,1]]],
      ['425',[[1,1,0,0,0,1,0,1,1,1,1,0,1,0,0,0,1,1,1,1,1,1],[0,1,0,0,0,1,1,1,1,1,1,0,1,0,0,0,1,1,1,1,1,1]]],
      ]

df = spark.createDataFrame(sample,["id", "data"])

Вот лог c, который нужно распараллелить, не полагаясь на память драйвера.

Ввод: Spark dataframe Выход: numpy массив для подачи в horovod (Примерно так: https://docs.databricks.com/applications/deep-learning/distributed-training/mnist-tensorflow-keras.html)

pandas_df = df.toPandas() # Not possible in real life
data_array = np.asarray(list(pandas_df.data.values))
data_array = data_array.reshape(data_array.shape[0], data_array.shape[1], -1, 1, order='F')
data_array = data_array.reshape(data_array.shape[0],data_array.shape[1],-1,1,1,order="F").transpose(0,1,3,2,-1)
# Some more numpy specific transformations ..

Вот подход, который не сработал:

@pandas_udf(ArrayType(IntegerType()), PandasUDFType.SCALAR)
def generate_feature(x):
    data_array = np.asarray(x)
    data_array = data_array.reshape(data_array.shape[0], ..
    ...
    return pd.Series(data_array)

df = df.withColumn("data_array", generate_feature(df.data))

1 Ответ

0 голосов
/ 06 марта 2020


Я пытаюсь работать над аналогичным случаем, используя Изображения. Я ищу Petastorm для этого. Вы можете сохранить ваши данные из формата Rdd в формат Parquet, а затем использовать их в horovod.
- Я еще не проверял это.
- Как получить набор данных по частям, используя ранги в horovod, тоже нужно проверить.
Просто подсказка, которая может помочь.
Спасибо.

...