在python中对类方法调用mapPartitions

在python中对类方法调用mapPartitions,python,apache-spark,Python,Apache Spark,我对Python和Spark还相当陌生,但让我看看是否可以解释我正在尝试做什么 我有很多不同类型的页面需要处理。我为这些页面的所有公共属性创建了一个基类,然后从基类继承了一个特定于页面的类。其想法是,spark runner在调用时只需更改页面类型,就可以对所有页面执行完全相同的操作 跑步者 def CreatePage(pageType): if pageType == "Foo": return PageFoo(pageType) elif pageType == "

我对Python和Spark还相当陌生,但让我看看是否可以解释我正在尝试做什么

我有很多不同类型的页面需要处理。我为这些页面的所有公共属性创建了一个基类,然后从基类继承了一个特定于页面的类。其想法是,spark runner在调用时只需更改页面类型,就可以对所有页面执行完全相同的操作

跑步者

def CreatePage(pageType):
   if pageType == "Foo":
      return PageFoo(pageType)
   elif pageType == "Bar":
      return PageBar(pageType)

def Main(pageType):
   page = CreatePage(pageType)
   pageList_rdd = sc.parallelize(page.GetPageList())
   return = pageList_rdd.mapPartitions(lambda pageNumber: CreatePage(pageType).ProcessPage(pageNumber))

print Main("Foo")
PageBaseClass.py

class PageBase(object):
   def __init__(self, pageType):
      self.pageType = None
      self.dbConnection = None

   def GetDBConnection(self):
      if self.dbConnection == None:
         # Set up a db connection so we can share this amongst all nodes.
         self.dbConnection = DataUtils.MySQL.GetDBConnection()
      return self.dbConnection

   def ProcessPage():
      raise NotImplementedError()
PageFoo.py

 class PageFoo(PageBase, pageType):
    def __init__(self, pageType):
       self.pageType = pageType
       self.dbConnetion = GetDBConnection()

    def ProcessPage():
       result = self.dbConnection.cursor("SELECT SOMETHING")
       # other processing
为了简洁起见,我省略了许多其他特定于页面的功能,但我的想法是,我希望在page类中保留如何处理该页面的所有逻辑。并且,能够共享诸如db连接和s3存储桶之类的资源

我知道现在的方式是为rdd中的每个项目创建一个新的页面对象。有没有办法做到这一点,使它只创建一个对象?有更好的模式吗?谢谢

一些建议:

  • 不要直接创建连接。使用连接池(因为每个执行器使用单独的进程将池大小设置为1就可以了),并确保连接在超时时自动关闭)
  • 用于存储池并调整代码以使用它检索连接
  • 您将无法在节点之间或甚至在单个节点内共享连接(请参阅关于单独进程的注释)。您可以得到的最佳保证是每个分区(或具有解释器重用的多个分区)有一个连接

谢谢您的建议。非常感谢。我忘了我切换到使用mapPartitions,所以我将更新问题的这一部分。我来看看博格模式。