Heim > Artikel > Backend-Entwicklung > Wie teile ich eine Vektorspalte in PySpark in Spalten auf?
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!