просто выполните это pip install mysqlclient==1.3.9
Это маловероятно, ошибка. Вы не предоставили код , необходимый для воспроизведения проблемы , но, скорее всего, вы используете Spark 2.0 с трансформаторами ML и сравниваете неправильные объекты.
Давайте проиллюстрируем это с помощью примера. Простые данные
from pyspark.ml.feature import OneHotEncoder
row = OneHotEncoder(inputCol="x", outputCol="features").transform(
sc.parallelize([(1.0, )]).toDF(["x"])
).first()
Теперь можно импортировать различные векторные классы:
from pyspark.ml.linalg import Vector as MLVector, Vectors as MLVectors
from pyspark.mllib.linalg import Vector as MLLibVector, Vectors as MLLibVectors
from pyspark.mllib.regression import LabeledPoint
и выполнить тесты:
isinstance(row.features, MLLibVector)
False
isinstance(row.features, MLVector)
True
Как вы видите, у нас есть pyspark.ml.linalg.Vector
not pyspark.mllib.linalg.Vector
, который несовместим со старым API:
LabeledPoint(0.0, row.features)
TypeError Traceback (most recent call last)
...
TypeError: Cannot convert type <class 'pyspark.ml.linalg.SparseVector'> into Vector
Вы можете преобразовать объект ML в MLLib one:
from pyspark.ml import linalg as ml_linalg
def as_mllib(v):
if isinstance(v, ml_linalg.SparseVector):
return MLLibVectors.sparse(v.size, v.indices, v.values)
elif isinstance(v, ml_linalg.DenseVector):
return MLLibVectors.dense(v.toArray())
else:
raise TypeError("Unsupported type: {0}".format(type(v)))
LabeledPoint(0, as_mllib(row.features))
LabeledPoint(0.0, (1,[],[]))
или просто:
LabeledPoint(0, MLLibVectors.fromML(row.features))
LabeledPoint(0.0, (1,[],[]))
, но, как правило, вам следует избегать ситуаций, когда это необходимо.
Если вы просто хотите преобразовать SparseVectors из pyspark.ml в pyspark.mllib SparseVectors, вы можете использовать MLUtils. Скажем, df - ваш фрейм данных, а столбец с SparseVectors называется «функциями». Затем следующие несколько строк позволяют выполнить следующее:
from pyspark.mllib.utils import MLUtils
df = MLUtils.convertVectorColumnsFromML(df, "features")
Эта проблема возникла для меня, потому что при использовании CountVectorizer из pyspark.ml.feature я не смог создать LabeledPoints из-за несовместимости с SparseVector от pyspark .ml
Интересно, почему их последняя документация CountVectorizer не использует «новый» класс SparseVector. Поскольку алгоритмы классификации нуждаются в методах LabeledPoints, это не имеет для меня никакого смысла ...
UPDATE: Я неправильно понял, что библиотека ml предназначена для объектов DataFrame, а библиотека mllib предназначена для объектов RDD. DataFrame-Datastructure рекомендуется начиная с Spark> 2,0, потому что SparkSession более совместим, чем SparkContext (но сохраняет объект SparkContext) и доставляет DataFrame вместо RDD. Я нашел этот пост, который дал мне «ага» -эффект: mllib и ml . Спасибо Альберто Бонсанто:).
Использовать f.e. NaiveBayes из mllib, мне пришлось преобразовать свой DataFrame в объекты LabeledPoint для NaiveBayes из mllib.
Но проще использовать NaiveBayes из ml, потому что вам не нужны LabeledPoints, но можно просто указать функцию - и class-col для вашего фрейма данных.
PS: Я боролся с этими проблемами часами, поэтому я почувствовал, что мне нужно опубликовать его здесь:)