在RDD上使用python类方法

在RDD上使用python类方法,python,class,apache-spark,pyspark,rdd,Python,Class,Apache Spark,Pyspark,Rdd,我的问题听起来可能有点类似于和,但尝试解决这些问题也没有帮到我。 我有一个定义为- class Tokenizer: def __init__(self, preserve_case=False): self.preserve_case = preserve_case def tokenize(self, s): """ Argument: s -- any string or unicode object Val

我的问题听起来可能有点类似于和,但尝试解决这些问题也没有帮到我。
我有一个定义为-

class Tokenizer:
    def __init__(self, preserve_case=False):
        self.preserve_case = preserve_case

    def tokenize(self, s):
        """
        Argument: s -- any string or unicode object
        Value: a tokenize list of strings; conatenating this list returns the original string if preserve_case=False
        """        
        # Try to ensure unicode:
        try:
            s = str(s)
        except UnicodeDecodeError:
            s = s.encode('string_escape')
            s = str(s)
        # Fix HTML character entitites:
        s = self.__html2unicode(s)
        # Tokenize:
        words = word_re.findall(s)
        # Possible alter the case, but avoid changing emoticons like :D into :d:
        if not self.preserve_case:            
            words = map((lambda x : x if emoticon_re.search(x) else x.lower()), words)
        return words
tok=Tokenizer(preserve_case=False)
我有一个(键,值)RDD(用户id,tweets)。我想在类tokenizer的tokenize函数上使用RDD的tweets。我所做的是-

rdd.foreach(lambda x:tok.tokenize(x[1])).take(5)  
并且得到了错误-

“非类型”对象没有属性“take”

我也试过-

rdd1.map(lambda x:tok.tokenize(x[1])).take(5)  
并且得到了错误-

() ---->1 rdd1.map(lambda x:tok.tokenize(x)).take(5)

~/anaconda3/lib/python3.6/site-packages/pyspark/rdd.py in take(self, 数值)1358 1359 p=范围(零件扫描, 最小值(零件扫描+最小零件数,总零件数)) ->1360 res=self.context.runJob(self,takeUpToNumLeft,p)1361 1362 items+=res

中的~/anaconda3/lib/python3.6/site-packages/pyspark/context.py 运行作业(self、rdd、partitionFunc、partitions、allowLocal)1067

SparkContext#运行作业。1068 mappedRDD=rdd.mapPartitions(partitionFunc) ->1069 sock_info=self.\u jvm.PythonRDD.runJob(self.\u jsc.sc(),mappedRDD.\u jrdd,partitions)1070返回 列表(_从_套接字加载(sock信息,mapperdd._jrdd_反序列化程序))
1071

中的~/anaconda3/lib/python3.6/site-packages/py4j/java_gateway.py 调用(self,*args)1255 answer=self.gateway\u client.send\u命令(command)1256返回值 =获取返回值( ->1257回答,self.gateway_客户端,self.target_id,self.name)1258 1259用于临时参数中的临时参数:

~/anaconda3/lib/python3.6/site-packages/py4j/protocol.py in 获取\返回\值(应答、网关\客户端、目标\ id、名称) 326 raise Py4JJavaError( 327“调用{0}{1}{2}时出错。\n”。 -->328格式(目标id,“.”,名称),值) 329其他: 330升起Py4JError(

Py4JJavaError:调用时出错 z:org.apache.spark.api.python.PythonRDD.runJob.: org.apache.spark.sparkeexception:由于阶段失败,作业中止: 阶段39.0中的任务0失败1次,最近一次失败:任务丢失 第39.0阶段中的0.0(TID 101,localhost,executor driver):org.apache.spark.api.python.PythonException:回溯(最新版本) 调用最后一个文件 “/home/kriti/Downloads/spark-2.4.3-bin-hadoop2.7/python/lib/pyspark.zip/pyspark/worker.py”, 第377行,主 process()文件“/home/kriti/Downloads/spark-2.4.3-bin-hadoop2.7/python/lib/pyspark.zip/pyspark/worker.py”, 第372行,正在处理中 serializer.dump_流(func(split_索引,迭代器),outfile)文件 “/home/kriti/Downloads/spark-2.4.3-bin-hadoop2.7/python/lib/pyspark.zip/pyspark/serializers.py”, 第397行,在dump_流中 bytes=self.serializer.dumps(vs)文件“/home/kriti/Downloads/spark-2.4.3-bin-hadoop2.7/python/lib/pyspark.zip/pyspark/serializers.py”, 第576行,在转储中 返回pickle.dumps(obj,protocol)AttributeError:无法pickle本地对象'Tokenizer.tokenize..'

在 org.apache.spark.api.python.BasePythonRunner$readeriator.handlePythonException(PythonRunner.scala:452) 在 org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRunner.scala:588) 在 org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRunner.scala:571) 在 org.apache.spark.api.python.BasePythonRunner$ReaderIterator.hasNext(PythonRunner.scala:406) 在 org.apache.spark.interruptableiterator.hasNext(interruptableiterator.scala:37) 位于scala.collection.Iterator$class.foreach(Iterator.scala:891) org.apache.spark.interruptblediator.foreach(interruptblediator.scala:28) 在 scala.collection.generic.growtable$class.$plus$plus$eq(growtable.scala:59) 在 scala.collection.mutable.ArrayBuffer.$plus$plus$eq(ArrayBuffer.scala:104) 在 scala.collection.mutable.ArrayBuffer.$plus$plus$eq(ArrayBuffer.scala:48) 在 scala.collection.TraversableOnce$class.to(TraversableOnce.scala:310) 在 org.apache.spark.interruptableiterator.to(interruptableiterator.scala:28) 在 scala.collection.TraversableOnce$class.toBuffer(TraversableOnce.scala:302) 在 org.apache.spark.interruptableiterator.toBuffer(interruptableiterator.scala:28) 在 scala.collection.TraversableOnce$class.toArray(TraversableOnce.scala:289) 在 org.apache.spark.interruptableiterator.toArray(interruptableiterator.scala:28) 在 org.apache.spark.api.PythonRDD$$anonfun$3.apply(PythonRDD.scala:153) 在 org.apache.spark.api.PythonRDD$$anonfun$3.apply(PythonRDD.scala:153) 在 org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:2101) 在 org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:2101) 位于org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:90) 位于org.apache.spark.scheduler.Task.run(Task.scala:121) org.apache.spark.executor.executor$TaskRunner$$anonfun$10.apply(executor.scala:408) 位于org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1360) 在 org.apache.spark.executor.executor$TaskRunner.run(executor.scala:414) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 运行(Thread.java:748)

驱动程序堆栈跟踪:在 org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$failJobAndIndependentStages(DAGScheduler.scala:1889) 在 org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1877) 在 org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1876) 在 收集鳞片