繁体   English   中英

map 函数在 lambda 函数中不可调用

[英]map function is not callable in lambda function

我希望减少以前创建的列表。 在输出中,结果显示“'map' object is not callable”或通过删除列表返回“<map object at 0x7fc398d98670>”

我看不出错误来自哪里。

import pyspark  
from pyspark.sql import SparkSession, Row
from pyspark.sql.types import MapType, StringType   
from pyspark.sql.functions import col
from pyspark.sql.types import StructType,StructField, StringType    
from itertools import groupby

words = data_df.select('name_annonceur').rdd.flatMap(lambda x: x).collect()
mapping = map((lambda x : (x, 1)), words)

sorted_mapping = sorted(mapping)
grouper = groupby(sorted_mapping, lambda p:p[0])

reduce = map(lambda l: (l[0], reduce(lambda x, y: x + y, map(lambda p:p[1], l[1]))), grouper)

代码在这里

MRE

让我们从一个最小的可重现示例开始。 该错误与 pyspark 完全无关,它是在将 Python 函数应用于由 pyspark 查询创建的简单数据结构时发生的。 删除所有与数据库相关的内容并插入一些硬编码的示例数据(与屏幕截图中可见的结构相同)使其他人更容易重现该错误(无需设置数据库并安装 pyspark):

from itertools import groupby

# hardcoded example data based on what we can see in the screenshot you posted
words = ['White Bug Entertainment', 'White Bug Entertainment', 'Blaststream', 'Teamtap', 'Teamtap']

mapping = map((lambda x : (x, 1)), words)
sorted_mapping = sorted(mapping)
grouper = groupby(sorted_mapping, lambda p:p[0])
reduce = map(lambda l: (l[0], reduce(lambda x, y: x + y, map(lambda p:p[1], l[1]))), grouper)

print(list(reduce))

修复它

该代码在 Python 2.7 中运行良好,打印

[('Blaststream', 1), ('Teamtap', 2), ('White Bug Entertainment', 2)]

但在 Python 3 中崩溃并显示您报告的错误消息。

TypeError: 'map' object is not callable

令人怀疑的是,该代码调用了一个名为reduce的函数并将结果分配给一个同名的变量。 如果我们更改变量的名称,请reduce例如result

# ...
result = map(lambda l: (l[0], reduce(lambda x, y: x + y, map(lambda p:p[1], l[1]))), grouper)
print(list(result))

Python 3 开始抛出一个新异常:

NameError: name 'reduce' is not defined

这是因为在 Python 3 中, reduce不再是一个内置函数(就像在 Python 2 中一样),而是存在于functools模块中。 添加缺少的导入语句

from functools import reduce

现在代码也可以在 Python 3 中运行。

您的代码中发生了什么

在 Python 3 中, map函数不会立即执行映射工作(就像在 Python 2 中所做的那样),而是返回一个迭代器对象,如果需要,它最终会在以后完成工作。 迭代器被分配给变量reduce 当您调用list(result)时,映射终于开始发生,调用 lambda 并调用reduce ,但此时reduce是一个保存迭代器的变量,该迭代器不可调用,并引发异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM