Как назначить ключ и значения для словаря в Python с помощью функции Lambda? - PullRequest
5 голосов
/ 21 апреля 2020

Я пытаюсь преобразовать фрейм данных с несколькими столбцами в словарь. Для этого я сначала проверил, могу ли я получить доступ к значениям из фрейма данных, и смог это сделать.

>>> dmap = {}
>>> der.show()
+----------+-------------------+
| tablename|incremental_log_ids|
+----------+-------------------+
|db.t1     |                  1|
|db.t2     |                  2|
|db.t3     |                  3|
+----------+-------------------+
>>> der.rdd.map(lambda x: (x[0], x[1])).collect()
[('db.t1', '1'), ('db.t2', '2'), ('db.t3', '3')]

Но когда я попытался добавить значения в словарь с помощью лямбда-функции, как показано ниже, Я не вижу пары значений ключа внутри словаря после завершения итерации.

>>> def addk(k:str, v:str):
...     dmap[k] = v
...
>>> der.rdd.map(lambda x: addk(x[0], x[1]))
PythonRDD[117] at RDD at PythonRDD.scala:53
>>>
>>> dmap
{}

Как видно из последнего оператора, dmap не показывает пары значений ключа после завершения итерации. , Может ли кто-нибудь сообщить мне, если я сделал здесь какую-либо ошибку и как я могу исправить ее?

1 Ответ

4 голосов
/ 21 апреля 2020

Там есть две проблемы. Первая проблема заключается в том, что ваши действия не выполняются. map() не работает с нетерпением (ленивая оценка в Spark применяется здесь). Поэтому вам нужно проверить dmap после выполнения действия, такого как count (), collect () и т. Д. c.

Вторая проблема заключается в том, что map() работает на рабочих, но Объект, в который вы ожидаете добавления значений, находится на драйвере. Может случиться так, что к dmap добавляется при локальном запуске, но вы не должны на это рассчитывать.

Простая реализация может быть просто словарным пониманием результата collect():

dmap = {r[0]:r[1] for r in der.collect()}

Какие распечатки

{'db.t1': '1', 'db.t2': '2', 'db.t3': '3'}

Тем не менее, вы должны быть осторожны с этим, поскольку фрейм данных может содержать слишком много данных для сбора в драйвере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...