Почему нельзя фильтровать функцию фильтра? - PullRequest
0 голосов
/ 28 марта 2019

Я хочу объединить два списка в python и отфильтровать этот полученный список.

У меня есть следующий датафрейм df:

+---+--------+
|v1 | v2 | v |
+---+--------+
|  2|   4| 24|
|  4|   2| 42|
|  1|   1| 11|
|  1|   3| 13|
|  2|   2| 22|
+---+----+---+

И у меня есть две переменные brodcast (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 brodcast, где 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 ]

1 голос
/ 29 марта 2019

Попробуйте:

pickle.loads(pickle.dumps(list(filteredList)))
1 голос
/ 29 марта 2019

Оба ответа выше верны.Но мне удается решить проблему следующим образом:

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)
1 голос
/ 28 марта 2019

Поскольку фильтр оценивается лениво, рассол не может прочитать значения.Потому что их пока нет.Возвращает итератор.Попробуйте:

filtered = filter(m_func, m_list)
pickle.dumps(list(filtered))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...