[英]How to assign key and values to a dictionary in Python using Lambda function?
我正在尝试将具有多列的 dataframe 转换为字典。 为此,我首先检查是否可以从 dataframe 访问您的值,并且我能够做到。
>>> 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')]
但是当我尝试使用 lambda function 将值添加到字典中时,迭代完成后我看不到字典中的键值对。
>>> 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 没有显示任何键值对。 如果我在这里犯了任何错误,谁能告诉我,我该如何纠正?
那里有两个问题。 第一个问题是您的操作没有运行。 map()
不会急切地运行(Spark 中的惰性求值在这里适用)。 所以你需要在运行一个动作后检查dmap
,比如count()、collect()等。
第二个问题是map()
在工作程序上运行,但是您希望将值添加到其中的 object 在驱动程序上。 在本地运行时可能会附加dmap
,但您不应指望这一点。
一个简单的实现可能只是对collect()
结果的字典理解:
dmap = {r[0]:r[1] for r in der.collect()}
哪个打印
{'db.t1': '1', 'db.t2': '2', 'db.t3': '3'}
但是,您需要小心这一点,因为数据帧可能包含太多数据,无法在驱动程序上收集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.