6

मेरे पास df है VectorUDT कॉलम features नामक डेटाफ्रेम है। मैं कॉलम का तत्व कैसे प्राप्त करूं, पहला तत्व कहूं?स्पार्क डेटाफ्रेम में वेक्टरोरटी कॉलम के तत्व का उपयोग कैसे करें?

मैं निम्नलिखित

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

Convert उत्पादन:

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

स्पष्टीकरण:

आउटपुट मूल्यों बराबर जावा वस्तुओं को reserialized किया जाना है। आप values पर पहुंचना चाहते हैं (SparseVectors से सावधान) आप item विधि का उपयोग करना चाहिए:

v.values.item(0) 

जो मानक अजगर scalars लौट आते हैं। इसी तरह यदि आप सभी मूल्यों को घने ढांचे के रूप में एक्सेस करना चाहते हैं:

v.toArray().tolist() 
+0

यह मेरे लिए काम नहीं करता है। – user2205916

+2

@ user2205916 यहां एक पुनरुत्पादित उदाहरण है। समझाने की देखभाल क्या __didn't काम नहीं है? :) – zero323

+1

यह तब तक मेरे लिए काम नहीं करता जब तक कि मैंने 'lit (1)' '' lit (0) 'बदल दिया ... जिसे मैं आपके पुनरुत्पादित उदाहरण से अनुमान लगा सकता हूं। तो धन्यवाद! –

संबंधित मुद्दे