Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Membahagikan Lajur Vektor kepada Lajur dalam PySpark?
Memisahkan Lajur Vektor kepada Lajur menggunakan PySpark
Anda mempunyai PySpark DataFrame dengan dua lajur: perkataan dan vektor, dengan vektor ialah lajur VectorUDT . Matlamat anda adalah untuk membahagikan lajur vektor kepada berbilang lajur, setiap satu mewakili satu dimensi vektor.
Penyelesaian:
Spark >= 3.0.0
Dalam Spark versi 3.0.0 dan ke atas, anda boleh menggunakan fungsi vector_to_array untuk mencapai ini:
<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>
Ini akan mencipta lajur baharu bernama word dan xs[0], xs[1], xs[2] dan seterusnya, mewakili nilai vektor asal.
Spark < 3.0.0
Untuk versi Spark yang lebih lama, anda boleh mengikuti pendekatan ini:
Tukar kepada RDD dan Ekstrak
<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>
Buat 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>
Mana-mana pendekatan akan menghasilkan DataFrame dengan lajur berasingan untuk setiap dimensi vektor asal, menjadikannya lebih mudah untuk bekerja dengan data.
Atas ialah kandungan terperinci Bagaimana untuk Membahagikan Lajur Vektor kepada Lajur dalam PySpark?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!