Maison  >  Article  >  développement back-end  >  Comment diviser une colonne vectorielle en colonnes dans PySpark ?

Comment diviser une colonne vectorielle en colonnes dans PySpark ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-01 01:06:01987parcourir

How to Split a Vector Column into Columns in PySpark?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn