2015-04-28 6 views
5

यह प्रश्न py4j से परिचित व्यक्तियों के लिए निर्देशित है - और एक पिकलिंग त्रुटि को हल करने में मदद कर सकता है। मैं pyspark पायथन XMLLibAPI को एक विधि जोड़ने की कोशिश कर रहा हूं जो नामित एक आरडीडी स्वीकार करता है, कुछ काम करता है, और एक परिणाम आरडीडी के रूप में देता है।Pyspark py4j PickleException: "क्लासडिक्ट के निर्माण के लिए अपेक्षित शून्य तर्क"

def trainALSModel(
    ratingsJRDD: JavaRDD[Rating], 
    ..) 

मौजूदा अजगर रेटिंग नए कोड मॉडल के लिए इस्तेमाल वर्ग है:

इस विधि PYthonMLLibAPI.trainALSModel() विधि, जिसका अनुरूप मौजूदा प्रासंगिक हिस्सों के साथ के बाद मॉडलिंग की है

class Rating(namedtuple("Rating", ["user", "product", "rating"])): 
    def __reduce__(self): 
     return Rating, (int(self.user), int(self.product), float(self.rating)) 

यहां प्रयास है तो यहां प्रासंगिक कक्षाएं हैं:

,210

न्यू अजगर वर्ग pyspark.mllib.clustering.MatrixEntry:

from collections import namedtuple 
class MatrixEntry(namedtuple("MatrixEntry", ["x","y","weight"])): 
    def __reduce__(self): 
     return MatrixEntry, (long(self.x), long(self.y), float(self.weight)) 

न्यू विधि foobarRDD PythonMLLibAPI में:

def foobarRdd(
    data: JavaRDD[MatrixEntry]): RDD[FooBarResult] = { 
    val rdd = data.rdd.map { d => FooBarResult(d.i, d.j, d.value, d.i * 100 + d.j * 10 + d.value)} 
    rdd 
    } 

अब हम इसे बाहर की कोशिश करते हैं:

from pyspark.mllib.clustering import MatrixEntry 

def convert_to_MatrixEntry(tuple): 
    return MatrixEntry(*tuple) 

from pyspark.mllib.clustering import * 
pic = PowerIterationClusteringModel(2) 
tups = [(1,2,3),(4,5,6),(12,13,14),(15,7,8),(16,17,16.5)] 
trdd = sc.parallelize(map(convert_to_MatrixEntry,tups)) 

# print out the RDD on python side just for validation 
print "%s" %(repr(trdd.collect())) 

from pyspark.mllib.common import callMLlibFunc 
pic = callMLlibFunc("foobar", trdd) 

फिर से प्रासंगिक भाग sults:

[(1,2)=3.0, (4,5)=6.0, (12,13)=14.0, (15,7)=8.0, (16,17)=16.5] 

जो इनपुट आरडीडी 'संपूर्ण' दिखाता है। हालांकि अचार बनाने दुखी था:

5/04/27 21:15:44 ERROR Executor: Exception in task 6.0 in stage 1.0 (TID 14) 
net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict 
(for pyspark.mllib.clustering.MatrixEntry) 
    at net.razorvine.pickle.objects.ClassDictConstructor.construct(ClassDictConstructor.java:23) 
    at net.razorvine.pickle.Unpickler.load_reduce(Unpickler.java:617) 
    at net.razorvine.pickle.Unpickler.dispatch(Unpickler.java:170) 
    at net.razorvine.pickle.Unpickler.load(Unpickler.java:84) 
    at net.razorvine.pickle.Unpickler.loads(Unpickler.java:97) 
    at org.apache.spark.mllib.api.python.SerDe$$anonfun$pythonToJava$1$$anonfun$apply$1.apply(PythonMLLibAPI.scala:1167) 
    at org.apache.spark.mllib.api.python.SerDe$$anonfun$pythonToJava$1$$anonfun$apply$1.apply(PythonMLLibAPI.scala:1166) 
    at scala.collection.Iterator$$anon$13.hasNext(Iterator.scala:371) 
    at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:327) 
    at scala.collection.Iterator$class.foreach(Iterator.scala:727) 
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1157) 
    at scala.collection.generic.Growable$class.$plus$plus$eq(Growable.scala:48) 
    at scala.collection.mutable.ArrayBuffer.$plus$plus$eq(ArrayBuffer.scala:103) 
    at scala.collection.mutable.ArrayBuffer.$plus$plus$eq(ArrayBuffer.scala:47) 
    at scala.collection.TraversableOnce$class.to(TraversableOnce.scala:273) 
    at scala.collection.AbstractIterator.to(Iterator.scala:1157) 
    at scala.collection.TraversableOnce$class.toBuffer(TraversableOnce.scala:265) 
    at scala.collection.AbstractIterator.toBuffer(Iterator.scala:1157) 
    at scala.collection.TraversableOnce$class.toArray(TraversableOnce.scala:252) 
    at scala.collection.AbstractIterator.toArray(Iterator.scala:1157) 
    at org.apache.spark.rdd.RDD$$anonfun$17.apply(RDD.scala:819) 
    at org.apache.spark.rdd.RDD$$anonfun$17.apply(RDD.scala:819) 
    at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1523) 
    at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1523) 
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:61) 
    at org.apache.spark.scheduler.Task.run(Task.scala:64) 
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:212) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:724) 

नीचे अजगर मंगलाचरण स्टैक ट्रेस का एक दृश्य है:

enter image description here

+0

हाय क्या आपने इसे हल किया? –

उत्तर

8

मैं एक ही त्रुटि थी के रूप में मैं MLlib उपयोग कर रहा था, और यह है कि मैं निकला मेरे कार्यों में से एक में गलत डेटाटाइप वापस कर दिया था। यह अब लौटे मूल्य पर एक साधारण कलाकार के बाद काम करता है। यह वह उत्तर नहीं हो सकता है जिसे आप चाहते हैं लेकिन कम से कम दिशा का पालन करने के लिए यह एक संकेत है।

+0

अब मैं उस प्रोजेक्ट पर काम नहीं करता - और इसलिए सत्यापित नहीं कर सकता। हालांकि यह एक उचित विचार की तरह लगता है तो ऊपर उठाया गया है। – javadba

1

मुझे स्पार्क संस्करण> = 2.0 का उपयोग करके यह त्रुटि मिली।

स्पार्क नए एमएल नेमस्पेस में एमएलआईबीबी फ्यूचनेलिटी को संक्रमण कर रहा है। ml.linalg.SparseVector और mllib.linalg.SparseVector

कुछ MLlib कार्यों अभी भी पुरानी mllib तरह

from pyspark.ml.linalg import Vectors 
# convert ML vector to older MLlib vector 
old_vec = Vectors.fromML(new_vec) 

HTH

+0

यह बेहद सहायक था - धन्यवाद! केवल एक चीज यह है कि संस्करण 2.1.1 में 'सेएमएल' अब मौजूद नहीं है, इसलिए मुझे 'pyspark.mllib.linalg.SparseVector (sv.size, sv.indices, sv.values) करके मैन्युअल रूप से ऑब्जेक्ट बनाना था। , जहां 'sv' मेरा 'pyspark.ml.linalg.SparseVector' ऑब्जेक्ट था। – LateCoder

1

एक ही मुद्दा है, कई बार था की उम्मीद: नतीजतन वहाँ स्पारसेवेक्टर के दो प्रकार हैं। numpy प्रकारों में pyspark.sql.types पर अंतर्निहित रूपांतरण नहीं हैं।

देशी प्रकार प्रणाली में एक साधारण स्पष्ट रूपांतरण करें। मेरे मामले में यह था:

float(vector_a.dot(vector_b) 
संबंधित मुद्दे