6

features adında bir VectorUDT sütununa sahip bir df veri karegim var. İlk eleman diyelim, sütunun bir elemanını nasıl alabilirim?Bir Spark DataFrame'deki VectorUDT sütununun öğesine nasıl erişilir?

aşağıdaki

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

yapıyor denedim ama net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict(for numpy.dtype) hatası alıyorum. Bunun yerine first_elem_udf = first_elem_udf(lambda row: row.toArray()[0]) yaparsam aynı hata.

Ayrıca, explode() da denedim, ancak bir dizi veya harita türü gerektirdiğinden bir hata alıyorum.

Bu genel bir işlem olmalı bence. float için

cevap

5

dönüştürme çıkışı:

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

Örnek kullanım:

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

Açıklama:

çıkış değerleri eşdeğer Java nesneleri reserialized gerekir. Standart Python skalarlar dönmek

v.values.item(0) 

: Eğer values erişmek istiyorsanız item yöntemi kullanmalısınız (SparseVectors dikkat). Benzer şekilde, tüm değerlere yoğun bir yapı olarak erişmek isterseniz:

v.toArray().tolist() 
+0

Bu benim için çalışmadı. – user2205916

+2

@ user2205916 Burada tekrarlanabilir bir örnek var. __did_________________________________ __ :) – zero323

+1

Bu, benim için işe yaramadı, ben (1) 'ye“ aydınlandı (0) ”değiştirilinceye kadar. Yani teşekkürler! –