Bagaimana untuk Membahagikan Lajur Vektor kepada Lajur dalam PySpark?

Susan Sarandon
Lepaskan: 2024-11-01 01:06:01
asal
998 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!