为了账号安全,请及时绑定邮箱和手机立即绑定

为什么过滤器功能不能pickle?

为什么过滤器功能不能pickle?

小唯快跑啊 2021-12-21 10:51:19
我想在python中合并两个列表过滤这个获得的列表。我有以下数据框 df:+---+--------+|v1 | v2 | v |+---+--------+|  2|   4| 24||  4|   2| 42||  1|   1| 11||  1|   3| 13||  2|   2| 22|+---+----+---+我有两个广播变量(collectAsMap):t1: {'3': ['4'], '1': ['2', '4', '3'], '2': ['3', '4']}t2: {'3': ['4'], '5': ['6'], '1': ['2']}我尝试了以下操作以过滤和合并列表merge_udf = udf(merge, ArrayType(StringType()))df = df.distinct().withColumn('MergeList', merge_udf(df.v1, df.v2)在哪里:"""merge two lists in one list"""def merge2List(listA, listB):    merge = [(itemA+itemB) for itemA in listA for itemB in listB]    return merge"""merge the entry of two entries of dataframes"""def merge(x, y):    listA = t1.value.get(x)    if(listA is None):        listA = []        listA.append(x)    listB = t2.value.get(y)    if(listB is None):        listB = []        listB.append(y)    m = merge2List(listA, listB)    return m得到的结果如下:+---+---------+------------+|v1 |v2       |   MergeList|+---+---------+------------+|  2|        4|    [34, 44]||  4|        2|        [42]||  1|        1|[22, 42, 32]||  1|        3|[24, 44, 34]||  2|        2|    [32, 42]|+---+---------+------------+我有一个 t3 广播变量,其中print(list(t3.value.keys()))给出['24', '42', '11', '13', '22']现在我想过滤掉合并列表列中每个列表中的元素。因此,我创建了以下函数并更新了 merge2List 函数:def filterList(v):    vert = list(t3.value.keys())    if(v in vert):        return True    return False"""merge two lists in one list"""    def merge2List(listA, listB):        merge = [(itemA+itemB) for itemA in listA for itemB in listB]        filteredList = filter(filterList, merge)        return filteredList引发以下异常:_pickle.PicklingError: Can't pickle <function filterList at 0x2b2fb1aa6840>: attribute lookup filterList on __main__ failed有人可以帮助确定我的错误在哪里吗?
查看完整描述

3 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

由于过滤器正在懒惰地评估,泡菜无法读取值。因为它们还不存在。它返回一个迭代器。尝试:


filtered = filter(m_func, m_list)

pickle.dumps(list(filtered))


查看完整回答
反对 回复 2021-12-21
?
弑天下

TA贡献1818条经验 获得超8个赞

尝试:

pickle.loads(pickle.dumps(list(filteredList)))


查看完整回答
反对 回复 2021-12-21
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

以上两个答案都是正确的。但我按照以下方法解决问题:

def merge2List(listA, listB):
    merge = [(itemA+itemB) for itemA in listA for itemB in listB]
    filteredList = filter(lambda x: x in list(t3.value.keys()), merge)
        return list(filteredList)


查看完整回答
反对 回复 2021-12-21
  • 3 回答
  • 0 关注
  • 172 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号