6

데이터 프레임이 df이고 VectorUDT 열이 features 인 항목이 있습니다. 첫 번째 요소에서 어떻게 열의 요소를 가져 옵니까?Spark DataFrame에서 VectorUDT 열의 요소에 액세스하는 방법은 무엇입니까?

나는 다음과 같은

from pyspark.sql.functions import udf 
first_elem_udf = udf(lambda row: row.values[0]) 
df.select(first_elem_udf(df.features)).show() 

일을 시도했지만 나는 net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict(for numpy.dtype) 오류가 발생합니다. 대신 first_elem_udf = first_elem_udf(lambda row: row.toArray()[0])을 입력하면 같은 오류가 발생합니다.

나는 또한 explode()을 시도했지만 배열이나 맵 유형이 필요하기 때문에 오류가 발생합니다.

이것은 일반적인 작업이어야한다고 생각합니다. float

답변

5

변환 출력 :

from pyspark.sql.types import DoubleType 
from pyspark.sql.functions import lit, udf 

def ith_(v, i): 
    try: 
     return float(v[i]) 
    except ValueError: 
     return None 

ith = udf(ith_, DoubleType()) 

사용 예제 :

from pyspark.ml.linalg import Vectors 

df = sc.parallelize([ 
    (1, Vectors.dense([1, 2, 3])), 
    (2, Vectors.sparse(3, [1], [9])) 
]).toDF(["id", "features"]) 

df.select(ith("features", lit(1))).show() 

## +-----------------+ 
## |ith_(features, 1)| 
## +-----------------+ 
## |    2.0| 
## |    9.0| 
## +-----------------+ 

설명 :

출력 값이 해당하는 자바 객체에 다시 일련 화해야합니다. 표준 파이썬 스칼라를 반환

v.values.item(0) 

: 당신이 values에 액세스하려는 경우 item 방법을 사용한다 (SparseVectors 조심). 마찬가지로 밀집된 구조로 모든 값에 액세스하려는 경우 :

v.toArray().tolist() 
+0

이것은 나를 위해 작동하지 않습니다. – user2205916

+2

@ user2205916 여기에 재현 가능한 예제가 있습니다. __ 어떤 일을하지 않았는지 설명해주십시오. :) – zero323

+1

'lit (1)'을'lit (0)'로 바꿀 때까지 이것은 나에게 도움이되지 않았습니다. 당신의 재현 가능한 예제에서 추측 할 수 있습니다. 감사합니다! –