Можно ли хранить массив numpy в столбце Spark Dataframe?

У меня есть dataframe, и я применяю к нему функцию. Эта функция возвращает numpy array, код выглядит так:

create_vector_udf = udf(create_vector, ArrayType(FloatType()))
dataframe = dataframe.withColumn('vector', create_vector_udf('text'))
dmoz_spark_df.select('lang','url','vector').show(20)

Теперь искра, кажется, недовольна этим и не принимает ArrayType(FloatType()) Я получаю следующее сообщение об ошибке: net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for numpy.core.multiarray._reconstruct)

Я мог бы просто numpyarray.tolist() вернуть его версию в виде списка, но, очевидно, мне всегда придется воссоздавать array, если я хочу использовать его с numpy.

так есть ли способ сохранить numpy array в dataframe column?


person Thagor    schedule 07.07.2017    source источник
comment
Возможный дубликат ошибки Spark: ожидаемые нулевые аргументы для построение ClassDict (для numpy.core.multiarray._reconstruct)   -  person Alper t. Turker    schedule 09.02.2018


Ответы (2)


Источником проблемы является то, что объект, возвращаемый UDF, не соответствует объявленному типу. create_vector должен не только возвращать numpy.ndarray, но также должен преобразовывать числовые значения в соответствующие типы NumPy, несовместимые с DataFrame API.

Единственный вариант - использовать что-то вроде этого:

udf(lambda x: create_vector(x).tolist(), ArrayType(FloatType()))
person pissall    schedule 02.10.2019

Один из способов сделать это — преобразовать каждую строку массива numpy в DataFrame в список целых чисел.

df.col_2 = df.col_2.map(lambda x: [int(e) for e in x])

Затем преобразуйте его в Spark DataFrame напрямую.

df_spark = spark.createDataFrame(df)
df_spark.select('col_1', explode(col('col_2')).alias('col_2')).show(14)
person user1460675    schedule 21.11.2019