如何使用Lambda函数为Python中的字典分配键和值?
我正在尝试将具有多列的数据帧转换为字典。为了做到这一点,我首先检查了我是否可以从数据帧访问这些值,并且我能够做到这一点如何使用Lambda函数为Python中的字典分配键和值?,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我正在尝试将具有多列的数据帧转换为字典。为了做到这一点,我首先检查了我是否可以从数据帧访问这些值,并且我能够做到这一点 >>> dmap = {} >>> der.show() +----------+-------------------+ | tablename|incremental_log_ids| +----------+-------------------+ |db.t1 | 1| |db.t2
>>> 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函数将值添加到字典中时(如下所示),在迭代完成后,我在字典中看不到键值对
>>> 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中的惰性计算在这里适用)。因此,在运行count()、collect()等操作后,您需要检查dmap
第二个问题是map()。在本地运行时,dmap
可能会被追加到,但您不应该指望这一点
一个简单的实现可能只是对collect()
结果的字典理解:
哪张照片
{'db.t1': '1', 'db.t2': '2', 'db.t3': '3'}
但是,您需要注意这一点,因为数据帧可能包含太多数据,无法在驱动程序上收集。sodmap=dict(der.rdd.map(lambda x:(x[0],x[1])).collect()
?
{'db.t1': '1', 'db.t2': '2', 'db.t3': '3'}