>  기사  >  백엔드 개발  >  PySpark에서 벡터 열을 열로 분할하는 방법은 무엇입니까?

PySpark에서 벡터 열을 열로 분할하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-01 01:06:01987검색

How to Split a Vector Column into Columns in PySpark?

PySpark를 사용하여 벡터 열을 열로 분할

단어와 벡터라는 두 개의 열이 있는 PySpark DataFrame이 있습니다. 여기서 벡터는 VectorUDT 열입니다. . 목표는 벡터 열을 여러 열로 분할하는 것입니다. 각 열은 벡터의 한 차원을 나타냅니다.

해결책:

Spark >= 3.0.0

Spark 버전 3.0.0 이상에서는 vector_to_array 함수를 사용하여 이를 달성할 수 있습니다.

<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>

이렇게 하면 word 및 xs[0]라는 새 열이 생성됩니다. xs[1], xs[2] 등은 원래 벡터의 값을 나타냅니다.

Spark < 3.0.0

이전 Spark 버전의 경우 다음 접근 방식을 따를 수 있습니다.

RDD로 변환 및 추출

<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>

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>

두 방법 모두 원본 벡터의 각 차원에 대해 별도의 열이 있는 DataFrame이 생성되므로 데이터 작업이 더 쉬워집니다.

위 내용은 PySpark에서 벡터 열을 열로 분할하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.