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
Freigeben: 2024-11-01 01:06:01
Original
1075 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage