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 중국어 웹사이트의 기타 관련 기사를 참조하세요!