我想在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))

慕莱坞森
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)
添加回答
举报
0/150
提交
取消