属性错误:'list'对象没有'map'属性。

6
我遇到了以下错误:
“AttributeError: 'list' object has no attribute 'map'”
以下是我的pyspark代码:
val rawData = sc.textFile("/PATH/train.tsv")
val records = rawData.map(line => line.split("\t"))
val data = records.map(lambda line: line.map(lambda x: x.replace ("\"","")))

错误在第3行,即“line.map”处。
此外,相应的Scala代码行正常工作,没有任何问题:
val data = records.map { r => r.map(_.replaceAll("\"", ""))

它给我想要的输出结果。

(该数据集从kaggle下载:http://www.kaggle.com/c/stumbleupon/data。)

已经苦苦挣扎了两天,请帮忙。

谢谢 gshweta

2个回答

4

你的问题在于你在lambda函数的参数上调用了.map方法。

根据前面的RDD转换,map方法的lambda表达式的参数类型是list.split方法的结果)。

你可能想要编写以下代码:

records.map(lambda line: list(map(lambda x: x.replace("\"",""), line)))

区别在于函数map (map(lambda x: x.replace("\"",""), line))是Python的内置函数(这不是一个列表函数 - 解释你收到的错误 - 也不是Spark的RDD.map)。

太棒了!!它运行得很好...因此,lambda参数总是被视为列表吗?此外,在lambda表达式中是否有任何方法可以将列表保存为RDD? - gshweta
基本上我想要这个Scala代码的Python等效代码:val data = records.map { r => val trimmed = r.map(_.replaceAll(""", "")) val label = trimmed(r.size - 1).toInt val features = trimmed.slice(4, r.size - 1).map(d => if (d == "?") 0.0 else d.toDouble) LabeledPoint(label, Vectors.dense(features)) } - gshweta
不同之处在于Scala的列表/集合有一个.map方法,但Python的list没有(但Python为此提供了一个内置的全局方法)。所以你的调用必须改变。不,lambda参数不需要是列表,它们是转换返回的类型(在这种情况下,line.split("\t")返回一个列表,这就是为什么接下来的map的lambda必须取一个列表的原因)。 - ernest_k

0

我认为您在使用map之前没有对数据进行并行化处理。请使用以下代码:

val rawData = sc.textFile("/PATH/train.tsv")
val recordsParell=sc.parallelize(rawData)
val records = recordsParell.map(line => line.split("\t"))

sc.parallelize API可以帮助加载用户创建的数据,这些数据不一定来自目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接