Dalam PySpark, anda mungkin menghadapi keperluan untuk mengekstrak dimensi individu daripada lajur vektor yang disimpan sebagai VectorUDT. Untuk mencapai matlamat ini, anda boleh memanfaatkan pelbagai pendekatan berdasarkan versi Spark anda.
Spark >= 3.0.0
PySpark 3.0.0 membawa fungsi terbina dalam untuk tugas 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 menukarkan vektor secara ringkas kepada tatasusunan dan menayangkan lajur yang dikehendaki.
Spark < 3.0.0
Versi Spark Pra-3.0.0 memerlukan pendekatan yang lebih rumit:
Penukaran RDD:
<code class="python">df.rdd.map(lambda row: (row.word,) + tuple(row.vector.toArray().tolist())).toDF(["word"])</code>
UDF Kaedah:
<code class="python">from pyspark.sql.functions import udf, col from pyspark.sql.types import ArrayType, DoubleType def to_array(col): return udf(lambda v: v.toArray().tolist(), ArrayType(DoubleType()))(col) df.withColumn("xs", to_array(col("vector"))).select(["word"] + [col("xs")[i] for i in range(3)])</code>
Nota: Untuk peningkatan prestasi, pastikan asNondeterministic digunakan dengan UDF (memerlukan Spark 2.3 ).
Scala Equivalent
Untuk persamaan Scala bagi pendekatan ini, rujuk "Spark Scala: Cara menukar Dataframe[vector] kepada DataFrame[f1:Double, ..., fn: Double)]."
Atas ialah kandungan terperinci Bagaimanakah anda Menukar VectorUDT kepada Lajur dalam PySpark?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!