无法 Pickle 线程锁对象

Gri*_*ing 5 python logging pickle apache-spark pyspark

我正在尝试在 python 中运行以下代码:

from pyspark.sql.types import StringType
from pyspark.sql.functions import udf  
from pyspark import SparkContext
from pyspark import SparkConf
import pyspark.sql.functions as pf
import logging
import sys

from pyspark.sql import SQLContext

log = logging.getLogger('EXT')

class Test:
    def __init__(self):
        pass

    def ext_udf(self, f):
        return udf(lambda f: self.test(1))
    def test(self,arg):
        return(arg)



    def create_df(self):
        log.info("Test")
        log.debug("Test")
        conf = SparkConf().setAppName('Extr')
        sc = SparkContext(conf=conf)
        sqlContext = SQLContext(sc)
        df = SQLContext.createDataFrame(sqlContext,[{'name': 'Alice', 'age': 1}])
        df.withColumn('meta-data', self.ext_udf(1)(pf.col("name"))).show()


if __name__ == "__main__":
    logging.basicConfig(stream=sys.stdout, level=logging.INFO)
    t=Test()
    t.create_df()
Run Code Online (Sandbox Code Playgroud)

我知道,这根本没有意义,但它确实重现了我的错误。

    Could not pickle thread lock
Run Code Online (Sandbox Code Playgroud)

或类似的东西。

现在我发现,它与日志记录对象以及 extract_udf() 中 self 方法的调用有关。当我删除日志记录时,它会起作用,当我使用非对象函数而不是 self.test() 时,它也会起作用。

您对如何解决此问题有任何想法,或者可以解释为什么会发生这种情况吗?

我不知道为什么链接消失了,但我想我会在这里尝试这篇文章: How to process RDDs using a Python class?

尽管我的问题看起来有所不同,但只要我不涉及日志记录,它就会起作用。