Comment diviser une colonne vectorielle en colonnes dans PySpark ?

Susan Sarandon
Libérer: 2024-11-01 01:06:01
original
998 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!