Heim >Backend-Entwicklung >Python-Tutorial >Wie teile ich eine Vektorspalte in PySpark in Spalten auf?

Wie teile ich eine Vektorspalte in PySpark in Spalten auf?

Susan Sarandon
Susan SarandonOriginal
2024-11-01 01:06:011074Durchsuche

How to Split a Vector Column into Columns in PySpark?

Vektorspalte mit PySpark in Spalten aufteilen

Sie haben einen PySpark-DataFrame mit zwei Spalten: Wort und Vektor, wobei Vektor eine VectorUDT-Spalte ist . Ihr Ziel ist es, die Vektorspalte in mehrere Spalten aufzuteilen, die jeweils eine Dimension des Vektors darstellen.

Lösung:

Spark >= 3.0.0

In Spark-Versionen 3.0.0 und höher können Sie die Funktion „vector_to_array“ verwenden, um Folgendes zu erreichen:

<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>

Dadurch werden neue Spalten mit den Namen „word“ und „xs[0]“ erstellt. xs[1], xs[2] usw., die die Werte des ursprünglichen Vektors darstellen.

Spark < 3.0.0

Für ältere Spark-Versionen können Sie diesen Ansätzen folgen:

In RDD konvertieren und extrahieren

<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>

Erstellen Sie eine 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>

Beide Ansätze führen zu einem DataFrame mit separaten Spalten für jede Dimension des Originalvektors, was die Arbeit mit den Daten erleichtert.

Das obige ist der detaillierte Inhalt vonWie teile ich eine Vektorspalte in PySpark in Spalten auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn