Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Membahagikan Lajur Vektor kepada Lajur dalam PySpark?

Bagaimana untuk Membahagikan Lajur Vektor kepada Lajur dalam PySpark?

Susan Sarandon
Susan Sarandonasal
2024-11-01 01:06:011074semak imbas

How to Split a Vector Column into Columns in 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn