web-dev-qa-db-fra.com

Création Spark dataframe à partir de la matrice numpy

c'est ma première fois avec PySpark, (Spark 2), et j'essaie de créer un cadre de données jouet pour un modèle Logit. J'ai exécuté avec succès le tutoriel et j'aimerais y passer mes propres données.

J'ai essayé ça:

%pyspark
import numpy as np
from pyspark.ml.linalg import Vectors, VectorUDT
from pyspark.mllib.regression import LabeledPoint

df = np.concatenate([np.random.randint(0,2, size=(1000)), np.random.randn(1000), 3*np.random.randn(1000)+2, 6*np.random.randn(1000)-2]).reshape(1000,-1)
df = map(lambda x: LabeledPoint(x[0], Vectors.dense(x[1:])), df)

mydf = spark.createDataFrame(df,["label", "features"])

mais je ne peux pas me débarrasser de:

TypeError: Cannot convert type <class 'pyspark.ml.linalg.DenseVector'> into Vector

J'utilise la bibliothèque ML pour le vecteur et l'entrée est un double tableau, alors quel est le problème, s'il vous plaît? Ça devrait aller selon documentation .

Merci beaucoup.

13
Jan Sila

Vous mélangez des fonctionnalités de ML et MLlib, qui ne sont pas nécessairement compatibles. Vous n'avez pas besoin d'un LabeledPoint lorsque vous utilisez spark-ml:

sc.version
# u'2.1.1'

import numpy as np
from pyspark.ml.linalg import Vectors

df = np.concatenate([np.random.randint(0,2, size=(1000)), np.random.randn(1000), 3*np.random.randn(1000)+2, 6*np.random.randn(1000)-2]).reshape(1000,-1)
dff = map(lambda x: (int(x[0]), Vectors.dense(x[1:])), df)

mydf = spark.createDataFrame(dff,schema=["label", "features"])

mydf.show(5)
# +-----+-------------+ 
# |label|     features| 
# +-----+-------------+ 
# |    1|[0.0,0.0,0.0]| 
# |    0|[0.0,1.0,1.0]| 
# |    0|[0.0,1.0,0.0]| 
# |    1|[0.0,0.0,1.0]| 
# |    0|[0.0,1.0,0.0]|
# +-----+-------------+

PS: Depuis Spark 2.0, les API basées sur RDD dans le package spark.mllib sont entrées en mode maintenance. L'API primaire d'apprentissage automatique pour Spark est maintenant l'API basée sur DataFrame dans le package spark.ml. [réf.]

5
desertnaut

De Numpy à Pandas à Spark:

spark.createDataFrame(pd.DataFrame(np.random.Rand(4,4),columns=list('abcd'))).show()

Sortie: +-------------------+-------------------+------------------+-------------------+ | a| b| c| d| +-------------------+-------------------+------------------+-------------------+ | 0.8026427193838694|0.16867056812634307|0.2284873209015007|0.17141853164400833| | 0.2559088794287595| 0.3896957084615589|0.3806810025185623| 0.9362280141470332| |0.41313827425060257| 0.8087580640179158|0.5547653674054028| 0.5386190454838264| | 0.2948395900484454| 0.4085807623354264|0.6814694724946697|0.32031773805256325| +-------------------+-------------------+------------------+-------------------+

7
Jeff Hernandez

Le problème est facile à résoudre. Vous utilisez simultanément les API ml et mllib. S'en tenir à un seul. Sinon, vous obtenez cette erreur.

Voici la solution pour mllibAPI:

import numpy as np
from pyspark.mllib.linalg import Vectors, VectorUDT
from pyspark.mllib.regression import LabeledPoint

df = np.concatenate([np.random.randint(0,2, size=(1000)), np.random.randn(1000), 3*np.random.randn(1000)+2, 6*np.random.randn(1000)-2]).reshape(1000,-1)
df = map(lambda x: LabeledPoint(x[0], Vectors.dense(x[1:])), df)

mydf = spark.createDataFrame(df,["label", "features"])

Pour l'API ml, vous n'avez plus vraiment besoin de LabeledPoint. Voici un exemple . Je suggère d'utiliser l'API ml car l'API mllib va bientôt devenir obsolète.

2
Dat Tran