【问题标题】:AttributeError: 'list' object has no attribute 'map'AttributeError:“列表”对象没有属性“地图”
【发布时间】:2018-03-30 05:17:05
【问题描述】:

我遇到以下错误:

"AttributeError: 'list' 对象没有属性 '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

【问题讨论】:

    标签: scala pyspark


    【解决方案1】:

    您的问题是您在 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 的内置函数(这既不是 list 函数 - 解释你得到的错误 - 也不是 Spark 的 RDD.map)。

    【讨论】:

    • 太棒了!!它工作得很好......所以 lambda 参数总是被视为列表?还有什么方法可以将列表保存为 lambda 表达式中的 RDD
    • 基本上我想为这个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)) }
    • 不同之处在于 scala list/collection 有一个 .map 方法,但 Python 的 list 没有(但 Python 为您提供了一个内置的全局方法)。所以你的电话必须改变。不,lambda 参数 not 必须是列表,它们是返回的先前转换的类型(在这种情况下,line.split("\t") 返回一个列表,这就是为什么下面的映射的 lambda 必须采用一个列表)
    【解决方案2】:

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

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

    sc.parallelize API 将有助于加载并非强制来自目录的用户创建的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      • 2016-05-14
      • 2016-12-21
      • 2022-01-23
      • 2022-01-23
      相关资源
      最近更新 更多