PySpark: преобразование SparseVector в тип массива SQL генерирует исключение net.razorvine.pickle.PickleException - PullRequest
0 голосов
/ 30 января 2019

pyspark: 2.3.2

Создание кадра данных из примеров Spark:

input_path = os.path.join(this_script_dir, "data", "sample_libsvm_data.txt")
training_data = self.spark.read.format("libsvm").load(input_path)

Существует столбец «features», который содержит SparseVector.Как показано на схеме ниже:

<class 'list'>: [StructField(features,VectorUDT,true)]

Я преобразую его, используя следующее:

spark.udf.register("sparseToArray", lambda x: numpy.array(x.toArray()), ArrayType(elementType=FloatType(), containsNull=False))
sql = "sparseToArray(features) as features"
data = training_data.selectExpr(sql)

После преобразования схема отображается как:

StructField(features,ArrayType(FloatType,false),true)

Вызовdata.collect() вызывает это:

net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for numpy.core.multiarray._reconstruct)
    at net.razorvine.pickle.objects.ClassDictConstructor.construct(ClassDictConstructor.java:23)
    at net.razorvine.pickle.Unpickler.load_reduce(Unpickler.java:707)
    at net.razorvine.pickle.Unpickler.dispatch(Unpickler.java:175)
    at net.razorvine.pickle.Unpickler.load(Unpickler.java:99)
    at net.razorvine.pickle.Unpickler.loads(Unpickler.java:112)
...