pyspark中的内部定义函数

时间:2017-06-21 00:32:54

标签: python apache-spark pyspark

最初我将date_compare_(date1,date2)作为整个类的方法,但它会报告错误。这是否意味着我们无法在地图或过滤器中调用函数本身之外的函数?像课堂上的方法一样?具体来说,最初我将date_compare_(date1,date2)作为类方法,但它不起作用。似乎现在它不起作用,只有当我把所有东西都放在一个函数中时

def extract_neighbors_from_users_network(self):
    end_date = self.arguments_dict['end_day']
    print("===================================")
    print(end_date)
    print("===================================")
    print("===================================")

    def date_compare_(date1, date2):
        date1_arr = date1.split("-")
        date2_arr = date2.split("-")
        for i in range(len(date1_arr)):
            if date1_arr[i] < date2_arr[i]:
                return True
            elif date1_arr[i] > date2_arr[i]:
                return False
        return True

    def date_filter_(date, start_date, end_date):
        return date_compare_(start_date, date) and self.date_compare_(date, end_date)

    def date_filter1(x):
        return date_filter_(x[0], "0000-00-00", end_date)

    rdd = self.sc.textFile(action_file).map(lambda x: x.split(',')).filter(lambda x: date_filter1(x)).filter(lambda x: x[4] == 'F')

1 个答案:

答案 0 :(得分:1)

rdd = self.sc.textFile我猜你的最初课程是这样的:

class YourClass():
    def __init__(self):
        self.sc = SparkContext()

    def date_compare_(self, date1, date2):
        pass

    def extract_neighbors_from_users_network(self):
        rdd = self.sc.textFile().map(self.date_compare_())

如果是这样,您应该将date_compare_更改为

@staticmethod
def date_compare_(date1, date2):
    pass

def extract_neighbors_from_users_network(self):
    rdd = self.sc.textFile().map(YourClass.date_compare_())

更新:

如果在self.date_compare_内引用rdd.map(),spark会将YourClass的整个实例作为任务发送给执行者。没关系。

但是! YourClass的实例包含SparkContext(),不能在执行者身上引用。这就是错误出现的原因。