Diviser la colonne vectorielle en colonnes à l'aide de PySpark
Vous disposez d'un DataFrame PySpark avec deux colonnes : mot et vecteur, où vecteur est une colonne VectorUDT . Votre objectif est de diviser la colonne du vecteur en plusieurs colonnes, chacune représentant une dimension du vecteur.
Solution :
Spark >= 3.0.0
Dans les versions Spark 3.0.0 et supérieures, vous pouvez utiliser la fonction vector_to_array pour y parvenir :
<code class="python">from pyspark.ml.functions import vector_to_array (df .withColumn("xs", vector_to_array("vector"))) .select(["word"] + [col("xs")[i] for i in range(3)]))</code>
Cela créera de nouvelles colonnes nommées word et xs[0], xs[1], xs[2], et ainsi de suite, représentant les valeurs du vecteur d'origine.
Spark < 3.0.0
Pour les anciennes versions de Spark, vous pouvez suivre ces approches :
Convertir en RDD et extraire
<code class="python">from pyspark.ml.linalg import Vectors df = sc.parallelize([ ("assert", Vectors.dense([1, 2, 3])), ("require", Vectors.sparse(3, {1: 2})) ]).toDF(["word", "vector"]) def extract(row): return (row.word, ) + tuple(row.vector.toArray().tolist()) df.rdd.map(extract).toDF(["word"]) # Vector values will be named _2, _3, ...</code>
Créez un UDF :
<code class="python">from pyspark.sql.functions import udf, col from pyspark.sql.types import ArrayType, DoubleType def to_array(col): def to_array_(v): return v.toArray().tolist() # Important: asNondeterministic requires Spark 2.3 or later # It can be safely removed i.e. # return udf(to_array_, ArrayType(DoubleType()))(col) # but at the cost of decreased performance return udf(to_array_, ArrayType(DoubleType())).asNondeterministic()(col) (df .withColumn("xs", to_array(col("vector"))) .select(["word"] + [col("xs")[i] for i in range(3)]))</code>
L'une ou l'autre approche entraînera un DataFrame avec des colonnes séparées pour chaque dimension du vecteur d'origine, ce qui facilitera le travail avec les données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!